Spring MVC denetleyici yöntemi değer döndürmezse ne döndürülür?


135

$.getJSON()Basit Spring MVC arka ucuma zaman uyumsuz çağrılar yapmak için jQuery kullanıyorum . Spring denetleyici yöntemlerinin çoğu şuna benzer:

@RequestMapping(value = "/someURL", method = RequestMethod.POST)
public @ResponseBody SomePOJO getSomeData(@ModelAttribute Widget widget,
    @RequestParam("type") String type) {
    return someDAO.getSomeData(widget, type);
}   

Her denetleyicinin @ResponseBody JSON olarak dönmesi , bu da istemci tarafının beklediği şey.

Ancak, bir isteğin herhangi bir içeriği istemci tarafına iade etmemesi gerektiğinde ne olur? Alabilir miyim:

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
public @ResponseBody void updateDataThatDoesntRequireClientToBeNotified(...) {
    ...
}

Değilse, burada kullanılacak uygun sözdizimi nedir?


Herhangi bir şey iade etmezseniz, geri gönderilen herhangi bir içerik olmayacak mı?
arahant

1
Çözümünüzün 1. Versiyonunda sadece bir "başarı" boolean veya benzeri bir şey olsa bile, yine de bir tür POJO döndürürüm. O halde, tüm AJAX yöntemlerinde tutarlı bir modele sahipsiniz ve bir şeyi geri vermeniz gerektiği ortaya çıktığında üzerine inşa edilmesi daha kolay olan bir şey var!
millhouse

Cevapların öneri olduğunun aksine, ikinci pasajınızda ilk olarak sahip olduğunuz şey mükemmel ve POSTverileri işlemenin doğru yoludur .
Brett Ryan

Bu durumda null dönecektir. @RestController genel sınıf RESTControllerExample {@RequestMapping (value = "/ çalışanlar", method = RequestMethod.GET) public void getEmployeeNames () {EmployeeSource.getEmployees (); System.out.println ("Bitirdim"); }}
spandey

Yanıtlar:


256

void döndürebilirsiniz, ardından yöntemi @ResponseStatus ile işaretlemeniz gerekir (değer = HttpStatus.OK) @ResponseBody'ye ihtiyacınız yok

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
public void updateDataThatDoesntRequireClientToBeNotified(...) {
    ...
}

Yalnızca alma yöntemleri bir 200 durum kodu implicity döndürür, sahip olduğunuz tüm diğerleri üç şeyden birini yapar:

  • Geri dönün ve yöntemi ile işaretleyin @ResponseStatus(value = HttpStatus.OK)
  • Bir nesne döndür ve şununla işaretle @ResponseBody
  • Bir İade HttpEntityörneği

2
Arada çalışma zamanı istisnası olması durumunda, HTTP 500 döndürülür ve 200 döndürülür. Bu nedenle, ön uç tutamacınız başarısız olursa, istisna / hata mesajı doğru şekilde görüntülenecektir.
Lee Chee Kiam

27
Aslında, ayarlamanıza gerek yoktur @ResponseStatusve yapmamalısınız. @ResponseBodyBir voidişleyiciye sahip olmak yeterince iyi.
Brett Ryan

11
Boş

1
@raspacorp 200, bir vücuda sahip olması gerektiği için POST için doğrudur.
Brett Ryan

8
@BrettRyan, bir yorum olarak, en azından bir REST API için, bir POST'un içerik oluşturmak için kullanılması yaygın bir uygulamadır; bu durumda, genellikle oluşturulan varlık (lar) ın kimliğini, oluşturulan varlıkların tamamını veya bir bağlantıyı döndürür. okuma işlemine. İçeriği olmayan bir 200 durum iadesi, REST API açısından kafa karıştırıcı olabilir.
raspacorp

43

Uygun başlığa sahip bir ResponseEntity döndürebilirsiniz:

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
public ResponseEntity updateDataThatDoesntRequireClientToBeNotified(...){
....
return new ResponseEntity(HttpStatus.OK)
}

Birinin yaptığım aynı problemle karşılaşması durumunda, bu baharın eski bir sürümünde işe yaramadı (4.1.1) 500 hata alırdım. 4.2.0'a yükselttim ve bu harika çalışıyor
sos

Bu da boş 200'ü iade etmek için tercih ettiğim yol. İlkbahar 4.1'den beri bunun yerine oluşturucu kalıbını kullanın: return ResponseEntity.ok (). Build ();
GreenTurtle

3
ResponseEntity is a raw type. References to generic type ResponseEntity<T> should be parameterized
Derleniyor

8

"ResponseEntity" nesnesini döndürebilirsiniz. "ResponseEntity" nesnesinin kullanılması, hem yanıt nesnesinin oluşturulması sırasında (Yanıt Gövdesi ve HTTP Durum Kodunu içeren) hem de yanıt nesnesinden bilgi alınması sırasında çok uygundur.

GetHeaders (), getBody (), getContentType (), getStatusCode () vb. Yöntemler, ResponseEntity nesnesini okuma işini çok kolaylaştırır.

Yanıt gövdesinin kasıtlı olarak boş olduğunu ve özellikle isteğin düzgün şekilde işlendiğini belirtmek için 204 (İçerik Yok) http durum koduna sahip ResponseEntity nesnesini kullanıyor olmalısınız. Doğru bilgileri iletmek için uygun Durum Kodlarını kullanmak, özellikle birden fazla istemci uygulaması tarafından kullanılacak bir API yapıyorsanız çok önemlidir.


3
ayar benim için tarayıcıda @ResponseStatus(HttpStatus.NO_CONTENT)çözüldüXML Parsing Error: no root element found
aliopi

3

Evet, voiddönüş türüyle @ResponseBody'yi kullanabilirsiniz :

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
@ResponseBody
public void updateDataThatDoesntRequireClientToBeNotified(...) {
    ...
}

1
yani dönüş türü ne olacak .. HTTP durum kodu mu?
spandey

@techBeginner Bu durumda 200 (Tamam).
Lakatos Gyula

2

Bir boşluğu iade etmede yanlış bir şey yok @ResponseBodyve yapmalısınPOST istekler .

Başkaları başarı durumundan bahsederken bunun yerine istisna işleyici rutinlerinde hataları tanımlamak için HTTP durum kodlarını kullanın. Normal bir yöntem, sizin istediğiniz gibi bir yanıt kodu döndürecektir 200, herhangi bir istisna işleyicisi daha sonra bir hata nesnesi ve farklı bir kod (yani 500) döndürebilir .


1

Ancak sisteminiz boyut ve işlevsellik açısından büyüdükçe ... bence her zaman bir json döndürmek hiç de kötü bir fikir değil. Daha çok mimari / "büyük ölçekli tasarım" meselesidir.

Her zaman iki bilgi alanına sahip bir JSON döndürmeyi düşünebilirsiniz: kod ve veri. Kod, yapılacak işlemin başarısını belirten sayısal bir koddur ve veriler, talep edilen işlem / hizmetle ilgili ek verilerdir.

Hadi, bir hizmet sağlayıcı arka uç kullandığımızda, herhangi bir hizmetin iyi çalışıp çalışmadığını görmek için kontrol edilebilir.

Bu yüzden, Spring'in bunu yönetmesine izin vermemek için, hibrit geri dönüş işlemlerini açığa çıkarıyorum (Bazıları verileri başka hiçbir şey döndürmez ...) .. Sunucunuzun daha homojen bir arayüz ortaya çıkardığından emin olun. Günün sonunda daha basit.


0

Eşzamansız bir yöntem için yaptığım örnek kod.

@RequestMapping(value = "/import", method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
public void importDataFromFile(@RequestParam("file") MultipartFile file) 
{
    accountingSystemHandler.importData(file, assignChargeCodes);
}

Yönteminizden herhangi bir şey döndürmenize gerek yoktur, bu ek açıklamayı kullanmanız gereken her şey, böylece yönteminizin her durumda Tamam döndürmesi gerekir.

@ResponseStatus(value = HttpStatus.OK)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.