2013-11-07 3 views
7

Заглавие, исключения, выброшенные из ParamConverter, НЕ обрабатываются так, как я ожидаю.Исключения, связанные с исключительным случаем, которые не обрабатываются ExceptionMapper

С ExceptionMapper:

@Provider 
public class MyExceptionMapper implements ExceptionMapper<MyException> { 
    @Override 
    public Response toResponse(MyException exception) { 
     return Response.serverError().entity("It triggered").build(); 
    } 
} 

и ParamConverter:

@Provider 
(boilerplate junk) 
    @Override 
    public DateTime fromString(String value) { 
     throw new MyException("convert"); 
    } 

Это не возвращает "Это вызвало" текст в 500 ошибок, а скорее 404.

Приготовить вопрос: зарегистрированы ли оба провайдера?

Да - Если я выброшу «MyException» из ресурса (в «регулярном» коде), он работает так, как ожидалось. Я также могу преобразовать seetrace с сообщением «convert».

Есть ли способ сделать исключения из ParamConverters обработкой ExceptionMapper?

Я использую Джерси 2.3.1, наряду с весенне-Джерси, запущенный в молах контейнера 9.1.0.RC0

ответ

2

SEEM от чтения this, спецификация JAX-RS говорит реализатор должен обернуть необработанное исключение в a NotFoundException (404) для @QueryParam и @PathParam, и из того, что я тестировал 400, (я предполагаю, BadRequestException) для @FormParam.

«если поле или свойство помечается @MatrixParam, @QueryParam или @PathParam то реализация должна генерировать экземпляр NotFoundException (404 статуса), который обертывает выброшенное исключение и никакого объекта»

A несколько способов я могу видеть обработки исключений, является

  1. Просто справиться с этим в ParamConverter, например,

    return new ParamConverter<T>() { 
    
        @Override 
        public T fromString(String string) { 
         try { 
          return (T)new MyObject().setValue(string); 
         } catch (MyException ex) { 
          Response response = Response.serverError().entity("Boo").build() 
          throw new WebApplicationException(response); 
         } 
        } 
    
        @Override 
        public String toString(T t) { 
         return t.toString(); 
        } 
    }; 
    
  2. Или просто ваше исключение распространяется WebApplicationException, и вернуть Response там. например

    public class MyException extends WebApplicationException { 
    
        public MyException(String message) { 
         super(Response.serverError().entity(message).build()); 
        } 
    } 
    
0

я испытал такое же поведение в Джерси 2.26.

Любое исключение, которое расширяет RuntimeException, сопоставляется с представлением ParamException, которое само по себе является подструктурой исключения WebApplicationException. Предполагая, что ваше MyException расширяет RuntimeException, оно не попадает, потому что ваш ExceptionMapper обрабатывает только MyException.

Что касается документов Джерси, которые бросают исключение NotFoundException: я бы сказал, что 404 не применяется, когда queryParam не может быть преобразован. Исключение BadRequestException кажется более подходящим.Кроме того, я не вижу ничего уникального в работе фреймворка Джерси, когда исключается исключение NotFoundException, кроме установки кода ответа

Чтобы получить исключения, выброшенные из ParamConverter, в ExceptionMapper, вам придется иметь свой ExceptionMapper вылавливая более глобальное исключение, например Throwable.

Другой ответ предполагает возврат исключения WebApplicationException. Это должно быть прекрасным решением, но НЕ будет работать, если объект Response имеет объект. См. Здесь: https://github.com/jersey/jersey/issues/3716

Смежные вопросы