我使用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时,我的custom异常映射器不会处理它。它继续抛出ParamException.QueryParamException,并将它提供给我的QueryParamException处理程序来处理响应。
你们有没有想过如何制作它,以便当转换变坏时,抛出CannotConvertAnimalException时,正确的映射器会处理它?</ p>
答案 0 :(得分:3)
好的找到了答案。事实证明,在尝试从字符串转换为对象时抛出的任何异常都将包含在QueryParamException中,因此将由QueryParamException ExceptionMapper处理(如果有的话)。解决此问题的一种方法是实际识别QueryParamException包装的异常,并使用某种Map将QueryParamException的原因与正确的处理程序相匹配
Map<Exception, ExceptionMapper> mapper;
和
catch(Exception e){
exMapper = mapper.get(exception.getCause);
}
当然,您需要使用正确的异常及其映射器加载yor map。我这样做是让spring为这个变量注入一个映射。
答案 1 :(得分:0)
尝试使用不同的JAX-RS框架。 (实际上你使用哪个框架?)
我认为在Wink中您的方案会起作用。