What to return if Spring MVC controller method doesn't return value?
JavaJquerySpring MvcJava Problem Overview
I am using jQuery's $.getJSON()
to make asynchronous calls to my simple Spring MVC backend. Most of the Spring controller methods look like this:
@RequestMapping(value = "/someURL", method = RequestMethod.POST)
public @ResponseBody SomePOJO getSomeData(@ModelAttribute Widget widget,
@RequestParam("type") String type) {
return someDAO.getSomeData(widget, type);
}
I have things set up so that each controller returns the @ResponseBody
as JSON, which is what the client-side expects.
But what happens when a request isn't supposed to return any content to the client-side? Can I have:
@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
public @ResponseBody void updateDataThatDoesntRequireClientToBeNotified(...) {
...
}
If not, what's the appropriate syntax to use here?
Java Solutions
Solution 1 - Java
you can return void, then you have to mark the method with @ResponseStatus(value = HttpStatus.OK) you don't need @ResponseBody
@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
public void updateDataThatDoesntRequireClientToBeNotified(...) {
...
}
Only get methods return a 200 status code implicity, all others you have do one of three things:
- Return void and mark the method with
@ResponseStatus(value = HttpStatus.OK)
- Return An object and mark it with
@ResponseBody
- Return an
HttpEntity
instance
Solution 2 - Java
You can simply return a ResponseEntity with the appropriate header:
@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
public ResponseEntity updateDataThatDoesntRequireClientToBeNotified(...){
....
return new ResponseEntity(HttpStatus.OK)
}
Solution 3 - Java
You can return "ResponseEntity
Methods like getHeaders(), getBody(), getContentType(), getStatusCode() etc makes the work of reading the ResponseEntity object very easy.
You should be using ResponseEntity
Solution 4 - Java
Yes, you can use @ResponseBody with void
return type:
@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
@ResponseBody
public void updateDataThatDoesntRequireClientToBeNotified(...) {
...
}
Solution 5 - Java
There is nothing wrong with returning a void @ResponseBody
and you should for POST
requests.
Use HTTP status codes to define errors within exception handler routines instead as others are mentioning success status. A normal method as you have will return a response code of 200
which is what you want, any exception handler can then return an error object and a different code (i.e. 500
).
Solution 6 - Java
But as your system grows in size and functionality... i think that returning always a json is not a bad idea at all. Is more a architectural / "big scale design" matter.
You can think about returing always a JSON with two know fields : code and data. Where code is a numeric code specifying the success of the operation to be done and data is any aditional data related with the operation / service requested.
Come on, when we use a backend a service provider, any service can be checked to see if it worked well.
So i stick, to not let spring manage this, exposing hybrid returning operations (Some returns data other nothing...).. instaed make sure that your server expose a more homogeneous interface. Is more simple at the end of the day.