Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在ExceptionMapper中捕获JsonMappingException<;可丢弃>;_Java_Rest_Jersey - Fatal编程技术网

Java 在ExceptionMapper中捕获JsonMappingException<;可丢弃>;

Java 在ExceptionMapper中捕获JsonMappingException<;可丢弃>;,java,rest,jersey,Java,Rest,Jersey,我们正在实现RestSerivce,Jersey在处理JsonMappingException时遇到了一个问题 我们要做的是将所有异常包装到一个特定的类RestError。但问题是Jersey JsonMappingException不会在ExceptionMapper中被捕获 RestError类 @XmlRootElement(name = "error") @XmlAccessorType(XmlAccessType.FIELD) public class RestError {

我们正在实现RestSerivce,Jersey在处理JsonMappingException时遇到了一个问题

我们要做的是将所有异常包装到一个特定的类RestError。但问题是Jersey JsonMappingException不会在ExceptionMapper中被捕获

RestError类

@XmlRootElement(name = "error")
@XmlAccessorType(XmlAccessType.FIELD)
public class RestError {

    private int statusCode;
    private RestErrorCode errorCode;
    private String message;
    private List<String> fullStackTrace;
}
@XmlRootElement(name=“error”)
@XmlAccessorType(XmlAccessType.FIELD)
公共类RestError{
专用int状态码;
私有RestErrorCode错误代码;
私有字符串消息;
私有列表跟踪;
}
ExeceptionMapper类

@Provider
@Priority(Priorities.USER)
public class ThroawableExceptionMapper implements ExceptionMapper<Throwable> {
    @Override
    public Response toResponse(Throwable throwable) {
        //Wrapping to RestError won't catch JsonMappingException
    }
}
@Provider
@优先级(Priorities.USER)
公共类ThroawableExceptionMapper实现ExceptionMapper{
@凌驾
公众响应(可丢弃可丢弃){
//包装到RestError不会捕获JsonMappingException
}
}
服务器端异常的stacktrace表示其原因是
org.glassfish.jersey.server.internal.process.MappableException:

根据jersey文档,自动发现功能默认启用

如果类路径中存在jackson-jaxrs-base-2.x.x.jar,则会自动注册JsonMappingExceptionMapper和JsonParseExceptionMapper,因为exceptionmapper是Jersey识别的附加SPI。此外,JSONMappingExceptionMapper和JsonParseExceptionMapper都使用@Provider注释进行注释

要禁用此自动查找功能,您需要设置FEAUTURE_Auto_Discovery_disable属性。看见这样杰克逊就不再注册了

resourceConfig.property(CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true);
现在注册您的资源、ExceptionMapper和JacksonJaxbJsonProvider(不要注册JacksonFeature.class)

像这样,JsonMappingException将在ThrowableExceptionMapper类中捕获


这个设置对我来说很有效,但有一个缺点,那就是我不能再用软件包注册我的资源了。我很确定有更好的方法来达到这个目标。任何改进都是非常受欢迎的

谢谢链接,但我在那里找不到解决方案。有公开票@你使用的是哪种Jersey和Jackson库?你有jesey media json jackson库吗?你也可以用:
resourceConfig.package(“com.example.providers”)
resourceConfig.register(com.organization.resources.InfoResource.class);
resourceConfig.register(com.organization.resources.ThrowableExceptionMapper.class);
resourceConfig.register(com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider.class);