java - ExceptionMapper 的 Jersey/Jackson 异常问题

标签 java exception exception-handling jersey jackson

我正在使用 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/

相关文章:

java - 返回一个值并抛出异常?

c# - 捕获所有内部异常详细信息的最佳做法是什么?

java - Java 中的泛型还是继承/接口(interface)?

java - 在 glassfish/soap java webservices 中禁用传输编码分块

java - Java中有没有一种方法可以使按钮默认在点击时获得焦点

c# - 如何从捕获的异常中打印消息?

java - 找不到资源时抛出异常是否正确

java - 无法捕获 NumberFormatException

spring-mvc - 如何捕获NoSuchFlowDefinitionException

java - 替换 < 和 > 的所有实例,但不替换它们之间的文本