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; } } }
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.
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.
The @ResponseBody annotation tells a controller that the object returned is automatically serialized into JSON and passed back into the HttpResponse object.
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.
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(); }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With