gpt4 book ai didi

java - 在 ExceptionMapper 中捕获 JsonMappingException

转载 作者:行者123 更新时间:2023-11-30 11:12:41 37 4
gpt4 key购买 nike

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

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

最佳答案

根据 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 .这样 jackson 就不再注册了。

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 类中被捕获。

这个设置对我有用,但缺点是我不能再用包注册我的资源我很确定有更好的方法来实现目标任何改进都非常受欢迎

关于java - 在 ExceptionMapper<Throwable> 中捕获 JsonMappingException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26757099/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com