2014-11-17 14 views
5

Spring kullanarak bir RESTful web servisi uygulayacağım. böyle sıradan bir PUT yöntemi, bir şey olalım: başarıyla hiçbir ekstra çaba ile Foo örneğine dönüştürülür (Bu Foo sınıfının karşılık geliyorsa) bu tür bir vaka girişi JSON biçimindeFarklı URL girişleri aynı URL'ye ve aynı yöntemle JSON biçiminde tüketiliyor RESTful service

@RequestMapping(method=RequestMethod.PUT, value="/foo") 
public @ResponseBody void updateFoo(@RequestBody Foo foo) { 
    fooService.update(foo); 
} 

veya hata olacak Yanlış formatta verilmesi. Ancak, hizmetin aynı yöntemi (ör. PUT) ve aynı URL'yi (ör./Foo) kullanarak iki farklı türde biçimi kullanmasını sağlamak istiyorum.

Yani gibi muhtemelen baktım:

//PUT method #1 
@RequestMapping(method=RequestMethod.PUT, value="/foo") 
public @ResponseBody void updateFoo(@RequestBody Foo foo) { 
    fooService.update(foo); 
} 

//PUT method #2 
@RequestMapping(method=RequestMethod.PUT, value="/foo") 
public @ResponseBody void updateFoo(@RequestBody FooExtra fooExtra) { 
    fooService.update(fooExtra); 
} 

ve Bahar dönüştürücü Foo ama aynı zamanda FooExtra ve giriş biçimine bağlı PUT yöntemini karşılık gelen çağrılan sadece giriş JSON dönüştürmek için çalıştı. Aslında, tam olarak yukarıda açıklandığı gibi değil, başarılı bir şekilde uygulamaya çalıştım. Bu mümkün mü? Belki bir çeşit "hile" ye ihtiyacım var? Böyle bir davranışı gerçekleştirmenin en iyi (ve en uygun) yolu nedir? Elbette, her zaman iki farklı URL yapabilirdim, ancak aynı olanla mümkün olup olmadığını bilmek isterim.

+0

Eğer "RESTful" öğesinin ne olduğunu biliyorsanız, medya türleri hakkında da bilgi sahibi olursunuz. Gitmenin yolu budur. – zeroflagL

cevap

6

Bahar url ve yöntem türü bakarak, istek karşı yöntemleriyle eşleşen çalıştığı için basitçe işe yaramadı girişiminiz Her iki durumda da aynıdır. Java'da aşırı yükleme gibi çalışmıyor; argüman türleri yöntemlerinizi ayırt etmez.
Ama iyi haberler var. SpringMVC ayrıca istek başlıklarını inceleyebilir ve işleyici yöntemlerinizi eşleştirmeye çalışırken parametreler talep edebilir. Geçmek istediğiniz şey, aslında aynı bilginin saf metadatası - alternatif biçim türü - özel bir istek üstbilgisini kullanmak için mükemmel bir anlam ifade eder. Bir dinlenme api kullanırken özel başlık eklemek çok kolaydır. JAX-RS: Adding a custom header için aşağıdaki bağlantıya bakın. Eğer siz nesneyi dönmek zorunda @ResponseBody bir dönüş değeri erişmek istiyorsanız aksi yöntemleri geçersiz yapmak da

//PUT method #1 
@RequestMapping(method=RequestMethod.PUT, value="/foo", headers="returnType=Foo") 
public @ResponseBody Foo updateFoo(@RequestBody Foo foo) { 
    fooService.update(foo); 
} 

//PUT method #2 
@RequestMapping(method=RequestMethod.PUT, value="/foo", headers="returnType=FooExtra") 
public @ResponseBody FooExtra updateFoo(@RequestBody FooExtra fooExtra) { 
    fooService.update(fooExtra); 
} 

Not: Eğer olarak işleyici yöntemlerini yapılandırmanız gerekir sunucu tarafında Şimdi

+0

Bu yaklaşım işe yaramasına rağmen, PUT/foo birçok dönüş türünü destekliyorsa, müşteriler için can sıkıcı olur. Ben benzer bir sorunla karşı karşıyayım, hala Spring-boot 1.5.6 ile daha optimize bir çözüm arıyorum – realPK

0

Anlamak için, Spring'in nasıl çalıştığını düşünmeliyiz, Dispatcher Servlet'i kullanıyor. Bu yayın farklı giriş türleri için çalışmayı “birleştirdiğini” düşünmüyorum.

Yani cevabım olacak: İki farklı adresler ile " hile";)

İlgili konular