json - 在JSON中返回Jersey异常

标签 json jersey

以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的ObjectMapperErrorInfo中的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/

相关文章:

php - 通过恢复 PHP 代码创建 JSON 字符串

java - 默认测试容器工厂,null,无法实例化

java - 有没有办法向下转型 GWT AutoBean?

php - 将图像 URL 上传到 mySQL 数据库以进行 JSON 输出

json - 使用 Polymer 读取和显示 json 数据

java - JAX-RS POST bean 属性的默认值

java - 尝试向 Grizzly+Jersey 应用程序添加过滤器时出现问题

json - 在单元测试中打印 Jersey JSON

java - 避免响应具有特定值的 JSON 字段

javascript - 如何在输入文本字段设置值