我有一个接收并返回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响应及以下内容:
{{1}}
我正在使用RestEasy框架为我的servlet和Jackson库序列化/反序列化JSON。我曾尝试使用ExceptionMapper,在我的web.xml文件中配置异常捕获,但我显然无法捕获该错误并返回空的HTTP响应。
如何使用RestEasy在HTTP端点上捕获JSON反序列化错误?
答案 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");
}