Существует несколько подходов для настройки поведения обработки ошибок с помощью JAX-RS. Вот три простых способа.
Первый подход заключается в создании класса Exception, расширяющего WebApplicationException.
Пример:
public class NotAuthorizedException extends WebApplicationException {
public NotAuthorizedException(String message) {
super(Response.status(Response.Status.UNAUTHORIZED)
.entity(message).type(MediaType.TEXT_PLAIN).build());
}
}
И чтобы бросить это новое исключение, вы просто:
@Path("accounts/{accountId}/")
public Item getItem(@PathParam("accountId") String accountId) {
// An unauthorized user tries to enter
throw new NotAuthorizedException("You Don't Have Permission");
}
Обратите внимание, вам не нужно объявлять исключение в предложении throws, потому что WebApplicationException - это исключение времени выполнения. Это вернет клиенту ответ 401.
Второй и более простой подход - просто создать экземпляр исключения WebApplicationException непосредственно в вашем коде. Этот подход работает до тех пор, пока вам не нужно реализовывать собственные исключения для приложений.
Пример:
@Path("accounts/{accountId}/")
public Item getItem(@PathParam("accountId") String accountId) {
// An unauthorized user tries to enter
throw new WebApplicationException(Response.Status.UNAUTHORIZED);
}
Этот код также возвращает 401 клиенту.
Конечно, это всего лишь простой пример. Вы можете сделать Исключение намного более сложным, если это необходимо, и вы можете сгенерировать любой необходимый http-код ответа.
Еще один подход - обернуть существующее исключение, возможно, ObjectNotFoundException, с помощью небольшого класса-обертки, который реализует интерфейс ExceptionMapper с аннотацией @Provider. Это сообщает среде выполнения JAX-RS, что, если возбужденное Exception вызвано, вернуть код ответа, определенный в ExceptionMapper.