使用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(); }