java - 当 jackson 反序列化失败时, Jersey 异常映射器不工作

标签 java rest jersey jackson

我在我的 REST API 中使用 Jersey 2.10 和 Jackson 序列化/反序列化功能。

我的想法是让我的 REST API 始终返回标准的 JSON 错误响应。为此,我有 ExceptionMapper 类,它们为 Jersey 应用程序中抛出的任何异常构建正确的 json 错误响应。我还有一个生成相同类型 JSON 响应的 jsp,我在 web.xml 中将其注册为错误页面,涵盖了加载 Jersey 之前可能出现的所有错误。

但是有一种情况,我的异常映射器和生成 jsp 的 json 都无法正常工作,即在将格式错误的 json 发送到 POST REST 端点时,它只返回以下消息:

HTTP/1.1 400 Bad Request
Server: Apache-Coyote/1.1
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, DELETE, PUT
Content-Type: text/plain
Content-Length: 210
Date: Tue, 24 Jun 2014 22:14:11 GMT
Connection: close

Can not deserialize instance of com.example.rest.User[] out of START_OBJECT token
 at [Source: org.glassfish.jersey.message.internal.EntityInputStream@1dcccac; line: 1, column: 1]

如何让 Jersey 返回我的自定义错误响应而不是这个?

更新:

根据@Lucasz 的回答,我做了更多研究,发现包 com.fasterxml.jackson.jaxrs.base ( https://github.com/FasterXML/jackson-jaxrs-providers/tree/master/base/src/main/java/com/fasterxml/jackson/jaxrs/base ) JsonMappingExceptionMapper 和 JsonParseExceptionMapper 中定义了两个异常映射器,它们似乎在影响我的自定义映射器。

如何注销这些映射器?

这就是我目前注册映射器的方式:

@ApplicationPath("/")
public class MyApp extends ResourceConfig{
    public SyntheticAPIApp() {
        packages("com.example.resource", "com.example.mapper");
        register(org.glassfish.jersey.jackson.JacksonFeature.class);
    }
}

最佳答案

我使用如下异常映射器对其进行了测试:

import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

import com.fasterxml.jackson.core.JsonProcessingException;

@Provider
public class JsonProcessingExceptionMapper implements ExceptionMapper<JsonProcessingException>{

        public static class Error {
            public String key;
            public String message;
        }

        @Override
        public Response toResponse(JsonProcessingException exception) {
            Error error = new Error();
            error.key = "bad-json";
            error.message = exception.getMessage();
            return Response.status(Status.BAD_REQUEST).entity(error).build();
        }
}

它奏效了。


更新:将 JsonParseException 更改为 JsonProcessingException(更通用)


更新 2: 为了避免注册不需要的映射器替换

register(org.glassfish.jersey.jackson.JacksonFeature.class);

register(com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider.class);

查看JacksonFeature的源码你就会明白发生了什么。

关于java - 当 jackson 反序列化失败时, Jersey 异常映射器不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24397647/

相关文章:

java - 如何测试这条 Camel 路线?依赖注入(inject)和环境变量

java - REST API 无法以 JSON 格式工作

java - 如何在过滤器方法中使用 ContainerRequestContext 获取 REST api 的有效负载

jaxb - Jersey + Moxy + JAXB - 如何在没有注释的情况下编码 XML

rest - 如何使用 FosRestBundle 公开函数结果?

java - 什么时候将 JDBC 与 lucene 索引结合使用是个好主意?

java - 与 Joda 时间 DateTime# centuryOfEra() 的混淆

java - Android - 奇怪的 EscapeUtil.unescapeString 崩溃

javascript - 在 nodejs + express 中验证 URL 以处理错误的请求错误

xml - REST 服务是否应该为 XML 响应公开 XSD?