Статьи

Обрабатывать пользовательские типы исключений в JAX-RS

JAX-RS поддерживает обработку пользовательских исключений — брошенных в EJB-компонентах или CID-бинах — в пользовательские ответы HTTP.

Предполагая, что у нас есть «исключительный» EJB:

01
02
03
04
05
06
07
08
09
10
11
@Stateless
public class Hello {
 
    public String greeting() {
        if (new Random().nextBoolean())
            throw new GreetingException("Could not greet");
 
        return "hello";
    }
 
}
1
2
3
4
5
6
7
8
@ApplicationException
public class GreetingException extends RuntimeException {
 
    public GreetingException(String message) {
        super(message);
    }
 
}

EJB используется в нашем ресурсе JAX-RS:

01
02
03
04
05
06
07
08
09
10
11
12
@Path("hello")
public class HelloResource {
 
    @Inject
    Hello hello;
 
    @GET
    public String hello() {
        return hello.greeting();
    }
 
}

Теперь для сопоставления возникающего исключения с пользовательским HTTP-ответом мы можем определить JAX-RS ExceptionMapper .

01
02
03
04
05
06
07
08
09
10
11
@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();
    }
 
}

Преобразователь исключений зарегистрирован как расширение JAX-RS (от @Provider ) и будет обрабатывать любые @Provider методом ресурса.

В этом примере иногда выводится HTTP 409 Conflict с заголовком Conflict-Reason: Could not greet .

Если вместо EJB используется управляемый компонент CDI, аннотация @ApplicationException не требуется.

Опубликовано на Java Code Geeks с разрешения Себастьяна Дашнера, партнера нашей программы JCG. См. Оригинальную статью здесь: Обработка пользовательских типов исключений в JAX-RS.

Мнения, высказанные участниками Java Code Geeks, являются их собственными.