JAX-RS поддерживает обработку пользовательских исключений — брошенных в EJB-компонентах или CID-бинах — в пользовательские ответы HTTP.
Предполагая, что у нас есть «исключительный» EJB:
|
01
02
03
04
05
06
07
08
09
10
11
|
@Statelesspublic 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
|
@ApplicationExceptionpublic 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
|
@Providerpublic 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, являются их собственными. |