使用XML或JSON的JAX-RS(泽西岛)自定义exception

我有一个使用泽西build立的REST服务。

我希望能够根据发送到服务器的MIME来设置我的自定义exception作者的MIME。 当接收到application/json时返回application/json ,当接收到application/xml时返回application/xml

现在我硬编码application/json ,但这是使XML客户端在黑暗中。

 public class MyCustomException extends WebApplicationException { public MyCustomException(Status status, String message, String reason, int errorCode) { super(Response.status(status). entity(new ErrorResponseConverter(message, reason, errorCode)). type("application/json").build()); } } 

我可以利用什么上下文来获得当前的请求Content-Type

谢谢!


根据答案更新

对于对完整解决scheme感兴趣的任何人:

 public class MyCustomException extends RuntimeException { private String reason; private Status status; private int errorCode; public MyCustomException(String message, String reason, Status status, int errorCode) { super(message); this.reason = reason; this.status = status; this.errorCode = errorCode; } //Getters and setters } 

与一个ExceptionMapper一起

 @Provider public class MyCustomExceptionMapper implements ExceptionMapper<MyCustomException> { @Context private HttpHeaders headers; public Response toResponse(MyCustomException e) { return Response.status(e.getStatus()). entity(new ErrorResponseConverter(e.getMessage(), e.getReason(), e.getErrorCode())). type(headers.getMediaType()). build(); } } 

ErrorResponseConverter是一个自定义的JAXB POJO

您可以尝试将@ javax.ws.rs.core.Context javax.ws.rs.core.HttpHeaders字段/属性添加到您的根资源类,资源方法参数或自定义的javax.ws.rs.ext.ExceptionMapper并调用HttpHeaders.getMediaType()。

headers.getMediaType()以实体的媒体types(不是Accept头)响应。 转换exception的适当方法是使用Accept标头,这样客户端就可以按照他们要求的格式获得响应。 鉴于上述解决scheme,如果您的请求如下所示(请注意JSON接受标头,但XML实体),您将返回XML。

 POST http:// localhost:8080 / service / giftcard / invoice?draft = true HTTP / 1.1
接受:application / json
授权:基本dXNlcjp1c2Vy
 Content-Type:application / xml
用户代理:Jakarta Commons-HttpClient / 3.1
主机:localhost:8080
代理连接:保持活动
内容长度:502
 <?xml version =“1.0”encoding =“UTF-8”standalone =“yes”?> <sample> <node1> </ node1> </ sample>

正确的实现是再次使用Accept头:

 public Response toResponse(final CustomException e) { LOGGER.debug("Mapping CustomException with status + \"" + e.getStatus() + "\" and message: \"" + e.getMessage() + "\""); ResponseBuilder rb = Response.status(e.getStatus()).entity( new ErrorResponseConverter(e.getMessage(), e.getReason(), e.getErrorCode())); List<MediaType> accepts = headers.getAcceptableMediaTypes(); if (accepts!=null && accepts.size() > 0) { //just pick the first one MediaType m = accepts.get(0); LOGGER.debug("Setting response type to " + m); rb = rb.type(m); } else { //if not specified, use the entity type rb = rb.type(headers.getMediaType()); // set the response type to the entity type. } return rb.build(); }