JAX-RS异常映射器不处理进行参数转换时引发的异常?

时间:2011-02-09 17:47:58

标签: java jaxb jax-rs

我使用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>

2 个答案:

答案 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中您的方案会起作用。