Exception handling is vital aspect of any application or service. Exceptions should be handled properly and appropriate messages must be generated to end user or service in case of any exception. Same applies to REST services also whether they are used by some front-end application or some other service uses it to perform some operations.
It becomes tricky when we deal with REST services as we need to expose all the supported status codes for both success and error response which our service can generate, so client application or service can handle them appropriately. Below are some samples of the status code.
200 - OK (API processes the request perfectly)
404 - Not found (Request URI or resource is not available)
500 - Internal server error (Request failed due to some error at runtime at service side)
There are multiple ways to handle the exceptions which we will see in below sections.
http://localhost:8080/jaxrs/hello/error
You will get the below response and status code.
It is very easy to implement the exception handling in Spring boot using @ControllerAdvice and @ExceptionHandler annotations. By default the handlers defined in @ControllerAdvice annotated class are applied globally but we can change it to point to some specific packages using "basePackages" attribute. We can define many handler methods to handle the different exceptions using @ExceptionHandler annotation.It becomes tricky when we deal with REST services as we need to expose all the supported status codes for both success and error response which our service can generate, so client application or service can handle them appropriately. Below are some samples of the status code.
200 - OK (API processes the request perfectly)
404 - Not found (Request URI or resource is not available)
500 - Internal server error (Request failed due to some error at runtime at service side)
There are multiple ways to handle the exceptions which we will see in below sections.
Manual exception handling
We can handle the exception manually also like using try-catch combination but we need to do that at each service level. May be we will be ending up with lot of duplicate code for some common exceptions and fair chances to miss it also in some placesException handling in SpringBoot with JAX-RS Rest service
JAX-RS uses ExceptionMapper to convert the exception to response. An exception mapper class need to be created by implementing ExceptionMapper interface and override the "toResponse()" method. It also should be annotated with @Provider so JAX-RS can find it during provider scanning phase and when a particular exception is thrown at runtime, JAX-RS will convert it to HTTP response as per mapper to send it to the requester.Mapper class implementation
@Provider public class MyExceptionHandler implements ExceptionMapper<Throwable>{ @Override public Response toResponse(Throwable arg0) { return Response.status(Response.Status.BAD_REQUEST).entity(arg0.getMessage()) .build(); } }
JAX-RS integration with SpringBoot
To implement the JAX-RS services with Spring we need to register the Jersey resource configuration. below code is for achieving the same purpose with SpringBoot. In below code we have registered the package "com.example.rest" where we keeping all our jax-rs code like REST endpoint classes, Providers etc.
@Configuration public class AppConfig{ @Bean public ResourceConfig jaxrsResourceConfig(){ return new ResourceConfig().packages("com.example.rest"); } }
Service class implementation
@Path("/jaxrs") public class JaxDemoRestService { @GET @Produces(MediaType.APPLICATION_JSON) @Path("/hello/{name}") public String welcome(@PathParam("name") String name) { if("error".equalsIgnoreCase(name)) throw new RuntimeException("\"error\" can't be used as a name."); return "Hello "+name; } }Now run the application and hit below URL in browser.
http://localhost:8080/jaxrs/hello/error
You will get the below response and status code.
Status Code: 400 Response: "error" can't be used as a name.
Exception handling in SpringBoot Rest service
Controller Advice
@ControllerAdvice public class ErrorHandlerConfig { @ExceptionHandler({RuntimeException.class}) public ResponseEntity<String> handleRunTimeException(RuntimeException e) { return new ResponseEntity<>(e.getMessage(), BAD_REQUEST); } }
Service class
@RestController @RequestMapping("/rest") public class HelloService { @RequestMapping("/welcome/{name}") @GET @Produces(MediaType.APPLICATION_JSON) public String welcome(@PathVariable("name") String name) { if("error".equalsIgnoreCase(name)) throw new RuntimeException("\"error\" can't be used as a name."); return "Welcome "+name; } }
Now run the application and hit below URL in browser.
http://localhost:8080/rest/welcome/error
You will get the below response and status code.
Status Code: 400 Response: "error" can't be used as a name.
A difficulty with Trial variations that expired too quickly
ReplyDeleteWondershare DVD Creator
Download Now PDF Checkpoint
Acronis True Image
Nero Burning ROM
Lightburn Crack
EaseUS Todo Backup Crack
Tally ERP 9 Crack
Your style is so unique compared to other people I have read stuff from. Many thanks forposting when you have the opportunity, Guess I will just bookmark this site K7 Total Security
ReplyDelete
ReplyDeleteGreat set of tips from the master himself. Excellent ideas
Scrivener Crack
Global Mapper Crack
Asphalt 9 Legends Crack
WhatsApp Plus Apk Crack
Such a Nice post. Thanks for Awesome tips Keep it up .
ReplyDeleteTraktor Pro Crack
windowsup.net
I am a professional web blogger so visit my website link is given below!To get more information
ReplyDeletePlugin Boutique Scaler v Crack/