gpt4 book ai didi

java - ExceptionMapper 的 Jersey/Jackson 异常问题

转载 作者:搜寻专家 更新时间:2023-10-30 19:41:47 25 4
gpt4 key购买 nike

我正在使用 Jersey 向外界提供 Java REST 服务。我提供了一些采用 JSON 的函数,我将 Jackson 框架与 jersey 结合使用,将它们转换为 POJO。

我有一个问题,如果错误的 jackson 格式被发送到服务器,答案(http 响应的内容)是一个 jackson 特定的异常描述。如果我有一个带有属性“surname”的 POJO 并将 json 字符串中的“sursname”发送到服务器,我得到:

Unrecognized field "sursname" (Class XY), not marked as ignorable at [Source: sun.net.httpserver.FixedLengthInputStream@903025; line: 1, column: 49] (through reference chain: XY["sursname"])

很好,但我想有我自己的响应内容,例如我自己的错误代码。我已经编写了一个自定义 ExceptionMapper,它应该映射所有 Throwable。

@Provider
public class WebserviceExceptionMapper implements ExceptionMapper<Throwable> {

@Override
public Response toResponse(Exception e) {
e.printStackTrace();
return Response.status(400).entity("{\"errorcode\":\"CRITICAL_ERROR\"}").type(MediaType.APPLICATION_JSON).build();
}
}

好像jackson异常是在调用我的webservice方法之前抛出的,所以我没有机会映射它?

有人有想法吗?非常感谢和抱歉我的英语 ;)

最佳答案

您的自定义 ExceptionMapper 没有捕获异常的原因是 Jackson 库提供了它自己的异常映射器,它在异常被您的通用异常映射器捕获之前捕获了异常。

有些人建议您应该为 JsonParseExceptionMapper 和 JacksonMappingExceptionMapper 实现自己的异常映射器,但是那样会产生不一致的结果。 See this issue on their GitHub .

要解决这个问题,您必须确保没有注册任何内置异常映射器。如果您正在为 JSON 使用 jackson-jaxrs-providers 库:jackson-jaxrs-json-provider,请确保您在您的应用程序类中注册 JacksonJaxbJsonProvider.classJacksonJsonProvider.class:

public class MyApplication extends ResourceConfig {
public MyApplication() {
register(JacksonJaxbJsonProvider.class)
}
}

注意 JacksonFeature.class,因为它注册了内置的 ExceptionMappers。还要远离 jersey-media-json-jackson 库,它会自动添加一些内置的异常映射器,您根本不需要做任何事情。

关于java - ExceptionMapper 的 Jersey/Jackson 异常问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5833147/

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