Java 在ExceptionMapper中捕获JsonMappingException<;可丢弃>;
我们正在实现RestSerivce,Jersey在处理JsonMappingException时遇到了一个问题 我们要做的是将所有异常包装到一个特定的类RestError。但问题是Jersey JsonMappingException不会在ExceptionMapper中被捕获 RestError类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 {
@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);