java - JAX-RS 异常映射器不处理参数转换时抛出的异常?

标签 java jaxb jax-rs

我使用 fromString 方法创建了自己的类,我相信 JAXB 将使用该方法将参数值字符串转换为我的对象。但是,在这个 fromString 方法中,我有一个 try catch block ,它冒出异常。像下面这样。

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 时,正确的映射器会处理它?<​​/p>

最佳答案

确定找到了这个问题的答案。事实证明,在尝试从字符串转换为对象时抛出的任何异常都将被包装在 QueryParamException 中,因此将由 QueryParamException ExceptionMapper(如果有的话)处理。解决这个问题的一种方法是实际识别 QueryParamException 包装了什么异常,并使用某种映射将 QueryParamException 的原因与正确的处理程序相匹配

Map<Exception, ExceptionMapper> mapper;

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

当然,您需要使用正确的异常及其映射器加载您的 map 。我通过让 spring 向这个变量注入(inject)一个映射来做到这一点。

关于java - JAX-RS 异常映射器不处理参数转换时抛出的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4948516/

相关文章:

java - JAX-RS:检索 ContainerRequestFilter 中的路径模式

java - MigLayout 使用 JScrollPane 调整大小

java - 错误java.lang.OutOfMemoryError:超出了GC开销限制

java - Eclipse 代码重构 - Junits

java - 如何在java中将哈希集添加到javax.ws.rs.core.Response

Java JAXB 编码器更改 < 但不更改 > 的编码

java - Jaxb:根元素中的 xsi 被替换为 ns2

java - 不调用抽象祖先的@PostConstruct

java - 我在这个 Jersey Java 类中做错了什么?

java - google app engine chunkSize & prefetchSize - 我在哪里可以阅读它的详细信息?