Enterprise Java
Handle custom exception types in JAX-RS
JAX-RS supports handling custom exceptions — thrown in either EJBs or CID beans — to custom HTTP responses.
Assuming we have an “exceptional” EJB:
@Stateless public class Hello { public String greeting() { if (new Random().nextBoolean()) throw new GreetingException("Could not greet"); return "hello"; } }
@ApplicationException public class GreetingException extends RuntimeException { public GreetingException(String message) { super(message); } }
The EJB is used in our JAX-RS resource:
@Path("hello") public class HelloResource { @Inject Hello hello; @GET public String hello() { return hello.greeting(); } }
Now to map the occurring exception to a custom HTTP response we can define a JAX-RS ExceptionMapper
.
@Provider public class GreetingExceptionMapper implements ExceptionMapper<GreetingException> { @Override public Response toResponse(GreetingException exception) { return Response.status(Response.Status.CONFLICT) .header("Conflict-Reason", exception.getMessage()) .build(); } }
The exception mapper is registered as a JAX-RS extension (by @Provider
) and will handle any GreetingException
thrown by a resource method.
The example will occasionally output HTTP 409 Conflict
with header Conflict-Reason: Could not greet
.
If a CDI managed bean is used instead of an EJB, the @ApplicationException
annotation is not required.
Published on Java Code Geeks with permission by Sebastian Daschner, partner at our JCG program. See the original article here: Handle custom exception types in JAX-RS Opinions expressed by Java Code Geeks contributors are their own. |