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.

Sebastian Daschner

Sebastian Daschner is a self-employed Java consultant and trainer. He is the author of the book 'Architecting Modern Java EE Applications'. Sebastian is a Java Champion, Oracle Developer Champion and JavaOne Rockstar.
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Inline Feedbacks
View all comments
Back to top button