以JSON格式返回Jersey异常的最佳方法是什么?
这是我的示例代码。
public static class CompoThngExceptionMapper implements ExceptionMapper<Exception> {
@Override
public Response toResponse(Exception exception) {
if (exception instanceof WebApplicationException) {
WebApplicationException e = (WebApplicationException) exception;
Response r = e.getResponse();
return Response.status(r.getStatus()).entity(**HERE JSON**).build();
} else {
return null;
}
}
提前致谢!!!
最佳答案
取决于您要返回的内容,但我个人有一个类似于以下内容的ErrorInfo
对象:
public class ErrorInfo {
final transient String developerMessage;
final transient String userMessage;
// Getters/setters/initializer
}
我将其作为
Exception
的一部分传递,然后我只使用Jackson的ObjectMapper
从ErrorInfo
中的ExceptionMapper
对象创建JSON字符串。这种方法的好处是您可以轻松扩展它,因此添加状态信息,错误时间等信息只是添加另一个字段的一种情况。请记住,添加诸如响应状态之类的东西有点浪费,因为无论如何这都会返回到HTTP header 中。
更新
如下所示为一个完整的示例(在这种情况下,ErrorInfo中包含更多字段,但您可以了解一般想法):
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
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;
import com.fasterxml.jackson.databind.ObjectMapper;
@Provider
public class UnexpectedExceptionMapper implements ExceptionMapper<Exception>
{
private static final transient ObjectMapper MAPPER = new ObjectMapper();
@Override
public Response toResponse(final Exception exception)
{
ResponseBuilder builder = Response.status(Status.BAD_REQUEST)
.entity(defaultJSON(exception))
.type(MediaType.APPLICATION_JSON);
return builder.build();
}
private String defaultJSON(final Exception exception)
{
ErrorInfo errorInfo = new ErrorInfo(null, exception.getMessage(), exception.getMessage(), (String)null);
try
{
return MAPPER.writeValueAsString(errorInfo);
}
catch (JsonProcessingException e)
{
return "{\"message\":\"An internal error occurred\"}";
}
}
}
关于json - 在JSON中返回Jersey异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15111134/