Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to respond with HTTP status code in a Spring MVC @RestController @ResponseBody class returning an object?

I'm trying to have a @RestController which takes a @PathVariable return a specific object in JSON format, along with proper status code. So far the way the code is, it will return the object in JSON format because it is using Spring 4 built in Jackson library by default.

However I do not know how to make it so it will give a message to the user saying we want an api variable, then JSON data, then Error code (Or success code depending if all went well). Example output would be:

Please enter api value as parameter (NOTE this can be in JSON as well if needed)

{"id": 2, "api": "3000105000" ... } (NOTE this will be the JSON response object)

Status Code 400 (OR proper status code)


The url with parameter look like this

http://localhost:8080/gotech/api/v1/api/3000105000 

The code I have so far:

@RestController @RequestMapping(value = "/api/v1") public class ClientFetchWellDataController {      @Autowired     private OngardWellService ongardWellService;      @RequestMapping(value = "/wells/{apiValue}", method = RequestMethod.GET)     @ResponseBody     public OngardWell fetchWellData(@PathVariable String apiValue){         try{             OngardWell ongardWell = new OngardWell();             ongardWell = ongardWellService.fetchOneByApi(apiValue);                  return ongardWell;         }catch(Exception ex){             String errorMessage;             errorMessage = ex + " <== error";             return null;         }     } } 
like image 498
Cris Avatar asked Oct 01 '14 04:10

Cris


People also ask

How do I return a response with status code in Spring boot?

Spring provides a few primary ways to return custom status codes from its Controller classes: using a ResponseEntity. using the @ResponseStatus annotation on exception classes, and. using the @ControllerAdvice and @ExceptionHandler annotations.

How do I set a response status code in Spring?

Sending Specific Response Status Codes The very basic way of sending response status is to use ResponseEntity object, which is returned by a controller. Controller can set a specific response status in the Response. Alternatively, we can use @ResponseStatus annotation to specify the desired status code.

What is @ResponseBody annotation in Spring?

The @ResponseBody annotation tells a controller that the object returned is automatically serialized into JSON and passed back into the HttpResponse object.


2 Answers

A @RestController is not appropriate for this. If you need to return different types of responses, use a ResponseEntity<?> where you can explicitly set the status code.

The body of the ResponseEntity will be handled the same way as the return value of any @ResponseBody annotated method.

@RequestMapping(value = "/wells/{apiValue}", method = RequestMethod.GET) public ResponseEntity<?> fetchWellData(@PathVariable String apiValue){     try{         OngardWell ongardWell = new OngardWell();         ongardWell = ongardWellService.fetchOneByApi(apiValue);          return new ResponseEntity<>(ongardWell, HttpStatus.OK);     }catch(Exception ex){         String errorMessage;         errorMessage = ex + " <== error";         return new ResponseEntity<>(errorMessage, HttpStatus.BAD_REQUEST);     } } 

Note that you don't need @ResponseBody on a @RequestMapping method within a @RestController annotated class.

like image 111
Sotirios Delimanolis Avatar answered Sep 19 '22 12:09

Sotirios Delimanolis


The idiomatic way would be to use an exception handler instead of catching the exception in your regular request handling method. The type of exception determines the response code. (403 for security error, 500 for unexpected platform exceptions, whatever you like)

@ExceptionHandler(MyApplicationException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) public String handleAppException(MyApplicationException ex) {   return ex.getMessage(); }  @ExceptionHandler(Exception.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public String handleAppException(Exception ex) {   return ex.getMessage(); } 
like image 21
Affe Avatar answered Sep 21 '22 12:09

Affe