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, являются их собственными. |