在ExceptionMapper中捕获JsonMappingException <throwable> </throwable>

时间:2014-11-05 12:21:41

标签: java rest jersey

我们正在实施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;
}

ExeceptionMapper类

@Provider
@Priority(Priorities.USER)
public class ThroawableExceptionMapper implements ExceptionMapper<Throwable> {
    @Override
    public Response toResponse(Throwable throwable) {
        //Wrapping to RestError won't catch JsonMappingException
    }
}

服务器端异常的堆栈跟踪说它的原因是a    org.glassfish.jersey.server.internal.process.MappableException:

1 个答案:

答案 0 :(得分:1)

根据Jersey文档,默认情况下启用自动发现功能 Jersey Auto Discoverable

如果您的类路径中存在jackson-jaxrs-base-2.x.x.jar,则JsonMappingExceptionMapper和JsonParseExceptionMapper都会自动注册,因为ExceptionMappers是Jersey识别的其他SPI。同时,两个JsonMappingExceptionMapper和JsonParseExceptionMapper都使用@Provider注释进行了声明。

要禁用此自动发现功能,您需要设置FEAUTURE_AUTO_DISCOVERY_DISABLE属性。见Jersey Configuring Auto-discovery Mechanism。这样杰克逊就不再被注册了。

resourceConfig.property(CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true);

现在注册你的资源,你的ExceptionMapper和JacksonJaxbJsonProvider(不要注册JacksonFeature.class)。

resourceConfig.register(com.organization.resources.InfoResource.class);
resourceConfig.register(com.organization.resources.ThrowableExceptionMapper.class);
resourceConfig.register(com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider.class);

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

此设置对我有用,但缺点是我无法再使用软件包注册我的资源我非常确定有更好的方法来实现目标任何改进都非常受欢迎