Поймать все Исключения, а также вернуть пользовательские ошибки в Джерси

Я хочу поймать все неожиданные Исключения в служении службы джерси. Поэтому я написал ExceptionMapper:

@Provider public class ExceptionMapper implements javax.ws.rs.ext.ExceptionMapper { private static Logger logger = LogManager.getLogManager().getLogger(ExceptionMapper.class.getName()); @Override public Response toResponse(Exception e) { logger.log(Level.SEVERE, e.getMessage(), e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("Internal error").type("text/plain").build(); } } 

Перехватчик действительно перехватывает все исключения. Поэтому я не могу писать:

 public MyResult getById(@PathParam("id")) { if (checkAnyThing) { return new MyResult(); } else { throw new WebApplicationException(Response.Status.NOT_FOUND); } } 

Это улавливается Mapper. Теперь я должен написать:

 public Response getById(@PathParam("id") { if (checkAnyThing) { { return Response.ok().entity(new MyResult()).build(); } else { return Response.status(Response.Status.NOT_FOUND).build(); } } 

Это правильный способ поймать все неожиданные исключения, а также вернуть ошибки (коды ошибок) в джерси? Или есть другой (более правильный) способ?

WebApplicationException есть getResponse из которого мы можем получить Response . Таким образом, вы можете проверить WebApplicationException в своем картографе. Возможно, что-то вроде

 @Override public Response toResponse(Throwable error) { Response response; if (error instanceof WebApplicationException) { WebApplicationException webEx = (WebApplicationException)error; response = webEx.getResponse(); } else { response = Response.status(Response.Status.INTERNAL_SERVER_ERROR) .entity("Internal error").type("text/plain").build(); } return response; } 

Таким образом, экземпляр WebApplicationException просто вернет ответ по умолчанию. Это фактически будет обрабатывать некоторые другие исключения, а также не бросать явным образом ваше приложение. WebApplicationException есть еще несколько исключений из-за своей иерархии, которые выдаются JAX-RS, для которых завершены предопределенные коды ответа / состояния.

 Exception Status code Description ------------------------------------------------------------------------------- BadRequestException 400 Malformed message NotAuthorizedException 401 Authentication failure ForbiddenException 403 Not permitted to access NotFoundException 404 Couldn't find resource NotAllowedException 405 HTTP method not supported NotAcceptableException 406 Client media type requested not supported NotSupportedException 415 Client posted media type not supported InternalServerErrorException 500 General server error ServiceUnavailableException 503 Server is temporarily unavailable or busy 

Это говорит о том, что мы можем явно исключить любое из этих исключений в наш код, чтобы дать ему более семантическое значение.

Вообще говоря, приведенный выше пример может быть ненужным, если вы не хотите изменять ответное сообщение / код состояния, как можно из приведенной выше таблицы, иерархия исключений уже имеет некоторое общее сопоставление. И в большинстве случаев неожиданные исключения уже будут сопоставлены с InternalServerErrorException

  • POST на службу службы REST службы Джерси 415 Неподдерживаемый тип носителя
  • Лучшая практика аутентификации на основе токенов REST с JAX-RS и Джерси
  • Давайте будем гением компьютера.