Преобразователь исключений JAX-RS не обрабатывает исключение, которое выдается при выполнении преобразования параметров? - PullRequest
1 голос
/ 09 февраля 2011

Я создал свой собственный класс с методом fromString, который, как я полагаю, JAXB будет использовать для преобразования строки значения параметра в мой объект. Однако внутри этого метода fromString у меня есть блок try catch, который заполняет исключение. Как следующее.

public class Animal{
    public static Animal fromString(final String input){ 

        try{ 
            ... 
        }catch(IllegalArgumentException ae){ 
            throw new CannotConvertAnimalException(); //this is my custom exception 
        } 
    }
}

И затем у меня есть сопоставитель для CannotConvertAnimalException, как показано ниже:

@Component
@Provider
public class CannotConvertAnimalExceptionHandler implements ExceptionMapper<CannotConvertAnimalException>

Дело в том, что в моем методе ресурсов. Я использую тип данных Animal

@GET
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response showAnimalInfo(Animal animal){....}

Оказывается, что когда строка параметра, которая должна быть преобразована в Animal, генерирует исключение CannotConvertAnimalException, мое обычное сопоставление исключений не обрабатывает его. Вместо этого он выбрасывает ParamException.QueryParamException и передает его моему обработчику QueryParamException для обработки ответа.

Ребята, знаете ли вы, как сделать так, чтобы, когда преобразование пошло не так, и когда сгенерировано исключение CannotConvertAnimalException, правильный обработчик обработал его?

Ответы [ 2 ]

3 голосов
/ 11 февраля 2011

ОК нашел ответ на это. Оказывается, что любое исключение, которое вы генерируете при попытке преобразовать строку в объект, будет заключено в QueryParamException и, таким образом, будет обработано QueryParamException ExceptionMapper (если оно есть). Один из способов обойти это - фактически определить, какое исключение обернуто QueryParamException, и использовать какой-то тип Map, чтобы сопоставить причину QueryParamException с правильным обработчиком

Map<Exception, ExceptionMapper> mapper;

и

catch(Exception e){
    exMapper = mapper.get(exception.getCause);
}

Конечно, вам нужно загрузить карту с правильным исключением и ее картографом. Я делаю это с помощью Spring вставляет карту в эту переменную.

0 голосов
/ 10 февраля 2011

Попробуйте использовать другую структуру JAX-RS. (На самом деле, какие рамки вы используете?)
Я думаю, что в Wink ваш сценарий будет работать.

...