Java 从筛选器序列化异常会引发错误

Java 从筛选器序列化异常会引发错误,java,json,jersey,cxf,Java,Json,Jersey,Cxf,我目前有一个RESTfulWebService跑步服。我最近添加了一个过滤器,它可以执行一些auth操作,并且可以在happy path的情况下工作。但是,当我需要从这个过滤器中抛出一个错误时,它不会将异常序列化为一个漂亮的json字符串,而是抛出一个500,错误如下: javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A message body writer for Java class myc

我目前有一个RESTfulWebService跑步服。我最近添加了一个过滤器,它可以执行一些auth操作,并且可以在happy path的情况下工作。但是,当我需要从这个过滤器中抛出一个错误时,它不会将异常序列化为一个漂亮的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/json
。这在我的实际
资源
类中不是问题,我可以在这些类中指定
@products
注释。从资源主体抛出的错误响应将正确序列化


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

您需要构建一个exceptionmapper来处理异常并将其转换为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() + "\"}";
  }
}
@Provider
公共类UnexpectedExceptionMapper实现ExceptionMapper
{
@凌驾
公众响应(最终例外)
{
ResponseBuilder builder=Response.status(status.BAD\u请求)
.实体(jsonError(例外))
.type(MediaType.APPLICATION_JSON);
返回builder.build();
}
私有字符串jsonError(最终异常)
{
返回“{\”error\”:\“”+exception.getMessage()+“\”}”;
}
}

是否添加了
servlet过滤器
jersey过滤器
?因此,我尝试了exceptionmapper路径,但无法使其工作。然而,你的答案中确实包含了解决方案。我遇到的问题是,我在过滤步骤中抛出的任何异常都会被CXF(关于八位字节流的未知写入程序的异常)转化为不同的异常。事实证明,我所需要做的就是在响应构建步骤中显式地定义类型(这里使用.type()调用)。我以前从未遇到过这种情况,因为我的所有其他异常都是从@products可用的地方抛出的。