【问题标题】:Catching JSON deserialization error on HTTP endpoint在 HTTP 端点上捕获 JSON 反序列化错误
【发布时间】:2017-05-20 05:15:08
【问题描述】:

我有一个接收和返回 JSON 内容的 HTTP 端点。

在测试边缘情况时,我发现端点在提交带有意外 JSON 对象的请求时会返回错误的详细内容。

详细来说,我期望的是一个字符串,而是提交一个对象,例如:

我希望:

{
  "myKey" : "someValue" 
}

当我提交时:

{
  "myKey" : {} 
}

提交错误内容时,我希望端点返回的是:

  • 状态代码为 400 且内容为空的 HTTP 响应。

然而,我收到的是:

  • 带有状态码 400 和以下内容的 HTTP 响应:

    Can not deserialize instance of java.lang.String out of START_OBJECT token
    at [Source: org.apache.catalina.connector.CoyoteInputStream@5bcfg1cc; line: 1, column: 11] (through reference chain: com.example.MyRequest["myKey"])
    

我正在为我的 servlet 和 Jackson 库使用 RestEasy 框架来序列化/反序列化 JSON。我尝试使用 ExceptionMapper 在我的 web.xml 文件中配置异常捕获,但我显然无法捕获该错误并返回空 HTTP 响应。

如何使用 RestEasy 在我的 HTTP 端点上捕获 JSON 反序列化错误?

【问题讨论】:

  • 你能发布你的消耗json的方法

标签: java json servlets serialization resteasy


【解决方案1】:

我正在使用下面的映射器并且正在工作

代替 e.getLocalizedMessage() 可以使用你的消息

package com.test.rest.service;

import java.util.Date;
import java.util.TimeZone;

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


@Provider
public class DefaultExceptionHandler implements ExceptionMapper<Exception> {


    public DefaultExceptionHandler() {
        super();
        TimeZone.setDefault(TimeZone.getTimeZone("IST"));
    }



    @Override 
    public Response toResponse(Exception e) {  

        // For simplicity I am preparing error xml by hand.
        // Ideally we should create an ErrorResponse class to hold the error info.
        StringBuilder response = new StringBuilder("<response>");
        response.append("<status>ERROR</status>");
        response.append("<message>"+e.getLocalizedMessage() + "</message>");
        response.append("<time>" + new Date().toString() + "</time>");
        response.append("</response>");
        return Response.serverError().entity(response.toString()).type(MediaType.APPLICATION_XML).build();
    } 



}

我的方法:

@GET
@Path("consumeJSON")
@Consumes(MediaType.APPLICATION_JSON)
public String consumeJSON(Map<String, String> outputMap) { 
    return outputMap.get("Hello");

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多