我们正在实现一个RestSerivce,我们有一个问题是泽西处理JsonMappingException的。
我们要做的是将所有异常包装到特定的类RestError。但问题是泽西岛的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
}
}服务器端异常的堆栈跟踪表明其原因是org.glassfish.jersey.server.internal.process.MappableException:
发布于 2014-11-10 15:26:40
根据泽西的文档,自动发现功能默认是启用泽西自动发现的
如果类路径中存在jackson-jaxrs-base-2.x.x.jar,则JsonMappingExceptionMapper和JsonParseExceptionMapper都会自动注册,因为ExceptionMappers是泽西识别的额外SPIs。此外,bothJsonMappingExceptionMapper和JsonParseExceptionMapper被@Provider注释所困扰。
若要禁用此自动发现功能,需要设置FEAUTURE_AUTO_DISCOVERY_DISABLE属性。见泽西配置自动发现机制。这样杰克逊就不再注册了。
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类中。
这个设置对我有效,但缺点是我不能再用包注册我的资源了,我确信有更好的方法来达到目标,任何改进都是受欢迎的。
https://stackoverflow.com/questions/26757099
复制相似问题