Over a million developers have joined DZone.

Handle Custom Exception Types in JAX-RS

DZone's Guide to

Handle Custom Exception Types in JAX-RS

Whether you're using EJBs or CDI beans, see how JAX-RS can help support handling custom exceptions to custom HTTP responses.

· Java Zone ·
Free Resource

Delivering modern software? Atomist automates your software delivery experience.

JAX-RS supports handling custom exceptions — thrown in either EJBs or CDI beans — to custom HTTP responses.

Assuming we have an “exceptional” EJB:

public class Hello {

    public String greeting() {
        if (new Random().nextBoolean())
            throw new GreetingException("Could not greet");

        return "hello";


public class GreetingException extends RuntimeException {

    public GreetingException(String message) {


The EJB is used in our JAX-RS resource:

public class HelloResource {

    Hello hello;

    public String hello() {
        return hello.greeting();


Now, to map the occurring exception to a custom HTTP response, we can define a JAX-RS ExceptionMapper.

public class GreetingExceptionMapper implements ExceptionMapper<GreetingException> {

    public Response toResponse(GreetingException exception) {
        return Response.status(Response.Status.CONFLICT)
                .header("Conflict-Reason", exception.getMessage())


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 the header Conflict-Reason: Could not greet.

If a CDI-managed bean is used instead of an EJB, the @ApplicationException annotation is not required.

Start automating your delivery right there on your own laptop, today! Get the open source Atomist Software Delivery Machine.

java ,exception handling ,jax-rs ,custom exceptions ,tutorial

Published at DZone with permission of

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}