如何在ExceptionMapper中为ResponseBuilder定义正确的MediaTypes

时间:2012-10-17 11:02:01

标签: cxf

我正面临以下问题:

我正在使用CXF进行REST服务。对于异常处理我正在使用javax.ws.rs.ext.ExceptionMapper而在public Response toResponse(T ex)我想要返回一些对象,例如

class MyObject {
    String detail;
}

方法的示例实现类似于

public Response toResponse(T ex) {
    MyObject o = new MyObject();
    o.detail = "...";
    return Response.status(400).entity(o).build();
}

但我遇到了问题

org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor writeResponseErrorMessage
WARNING: No message body writer has been found for response class RequestError.

当我指定MediaType

时,我发现了
return Response.status(400).entity(o).type("application/json").build();

一切都很好,但我不知道客户接受哪种类型......

当然我可以在哪里存储客户接受的类型,然后使用正确的类型,但这闻起来。我想用更好的东西。

例如,在我的CXF端点中,我可以使用@Produces指定我的控制器方法生成哪种MediaType,CXF / Spring选择正确的类型。我也在我的ExceptionMapper中尝试过它,但它不起作用。

1 个答案:

答案 0 :(得分:0)

你可以这样做吗

@Context HttpHeaders headers;

public Response toResponse(Exception e) {
    ExceptionEntity ee = new ExceptionEntity(e);
    ResponseBuilder rb = Response.status(Response.Status.INTERNAL_SERVER_ERROR);
    rb.type(headers.getMediaType());
    rb.entity(ee);
    Response r = rb.build();
    return r;
}

我正在使用cxf-rs 2.7.5