fre*_*shy 15 java exception-handling exception jersey jackson
我正在使用Jersey为外界提供java REST服务.我提供了一些采用JSON的功能,我将Jackson框架与jersey结合使用,将它们转换为POJO.
我有一个问题,如果错误的杰克逊格式被发送到服务器,答案(http响应的内容)是杰克逊特定的异常描述.如果我有一个带有属性"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,它应该映射所有Throwables.
@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();
    }
}
似乎在调用我的webservice方法之前抛出了jackson异常,所以我没有机会映射它?
有没有人有想法?非常感谢,对不起我的英语;)
Chr*_*son 17
您的自定义ExceptionMapper没有捕获异常的原因是因为Jackson库提供了自己的异常映射器,它在您的genereal异常映射器捕获之前捕获异常.
有些人建议您应该为JsonParseExceptionMapper和JacksonMappingExceptionMapper实现自己的异常映射器,但是,这会产生不一致的结果.在他们的GitHub上看到这个问题.
要解决此问题,您必须确保没有注册任何内置的异常映射器.如果您正在为JSON:jackson-jaxrs-json-provider使用jackson-jaxrs-providers库,请确保您只在Application类中注册JacksonJaxbJsonProvider.class或JacksonJsonProvider.class:
public class MyApplication extends ResourceConfig {
    public MyApplication() {
        register(JacksonJaxbJsonProvider.class)
    }
}
注意JacksonFeature.class,因为它注册了内置的ExceptionMappers.还要远离jersey-media-json-jackson库,它会自动添加一些内置的异常映射器,而你根本不需要做任何事情.
当然,Jackson 异常之前会抛出:调用 Jackson 提供程序是为了创建您在方法中期望的对象。但是,使用 ExceptionMapper,您不仅应该能够映射您的异常,还应该能够映射提供者异常。
您确定您的提供商已注册吗?如果您从方法而不是提供者抛出异常,它是否会被调用?
如果上一个问题的答案是“是”,请尝试为具体异常实现 ExceptionMapper 而不是 Throwable。