在HTTP端点上捕获JSON反序列化错误

时间:2017-01-05 15:32:07

标签: java json servlets serialization resteasy

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

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

详细说明,我希望有一个字符串,而是提交一个对象,例如:

我期待:

{
  "myKey" : {} 
}

我提交时:

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"])

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

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

然而,我收到的是:

  • 状态代码为400的HTTP响应及以下内容:

    {{1}}

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

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

1 个答案:

答案 0 :(得分:0)

我正在使用下面的mapper并正在使用

代替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");

}