【问题标题】:Serializing Jersey exceptions from filter throws error从过滤器中序列化 Jersey 异常会引发错误
【发布时间】:2013-01-07 16:41:25
【问题描述】:

我目前有一个运行 Jersey 的 RESTful 网络服务。我最近添加了一个过滤器来做一些认证工作,它适用于快乐路径的情况。但是,当我需要从这个过滤器中抛出一个错误时,而不是将异常序列化为一个漂亮的 json 字符串,它会抛出一个 500 并出现以下错误:

javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A message
body writer for Java class myclass, and Java type class myclass, and MIME media type
application/octet-stream was not found

问题是,我不想向 application/octet-stream 写入任何内容。我的服务只使用application/json。这在我的实际Resource 类中不是问题,我可以在其中指定@Produces 注释。从资源主体抛出的错误响应将正确序列化。

那么,我的问题是:如何控制过滤时抛出的异常使用什么 MIME 类型?

【问题讨论】:

  • 您添加了servlet filter 还是jersey filter

标签: java json jersey cxf


【解决方案1】:

您需要构建一个异常映射器来处理异常并将它们转换为 JSON。比如:

@Provider
public class UnexpectedExceptionMapper implements ExceptionMapper<Exception>
{
  @Override
  public Response toResponse(final Exception exception)
  {
    ResponseBuilder builder = Response.status(Status.BAD_REQUEST)
                                      .entity(jsonError(exception))
                                      .type(MediaType.APPLICATION_JSON);
    return builder.build();
  }

  private String jsonError(final Exception exception)
  {
    return "{\"error\":\"" + exception.getMessage() + "\"}";
  }
}

【讨论】:

  • 所以,我尝试了 exceptionmapper 路由,但无法正常工作。但是,您的答案确实包含解决方案。我遇到的问题是,我在过滤步骤中抛出的任何异常都被 CXF 变成了另一个异常(关于八位字节流的未知作者的异常)。事实证明,我需要做的就是在响应构建步骤中显式定义类型(您在此处使用 .type() 调用执行此操作)。我以前从未遇到过这种情况,因为我所有的其他异常都是从@Produces 可用的地方抛出的。
猜你喜欢
  • 2017-11-14
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-08
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多