繁体   English   中英

如何在JAX-RS ExceptionMapper中获取响应的内容类型

[英]How to get content type of the response in JAX-RS ExceptionMapper

我有一个资源:

@GET
@Path("/print-order")
@Produces("application/pdf")
public byte[] printOrder(@QueryParam("id") Long orderId) {
    return ...;
}

...这可能会引发与用户相关的错误,并且必须显示为HTML页面。 因此,我实现了ExceptionMapper但是我不知道如何获取被调用资源的@Produces("application/pdf")批注的值。

@Provider
public class CustomExceptionMapper implements ExceptionMapper<CustomException> {
    @Override
    public Response toResponse(CustomException exception) {
        if (contentType = "application/pdf")
            ... html respone
        else
            ... entity response
    }
}

我在Jersy 1.12实现中使用JAX-RS 1.x(jsr311),但希望拥有独立于实现的解决方案。

您可以将不同的上下文对象注入ExceptionMapper以获取有关其处理的请求的更多信息。 根据HTTP的Accept标头确定客户端期望的内容类型很方便( 在此处了解更多信息 )。

以下是有关如何使ExceptionMapper基于API客户端指定(或未指定)的Accept标头以不同格式进行响应的示例。

@Provider
public class CustomExceptionMapper implements ExceptionMapper<CustomException> {

   // Inject headers of the request being processed
   @Context
   private HttpHeaders headers;

   // or even all the request details
   @Context
   private HttpServletRequest request;

   @Override
   public Response toResponse(CustomException exception) {
      List<MediaType> acceptedTypes = headers.getAcceptableMediaTypes();
      if (acceptedTypes.contains(MediaType.APPLICATION_JSON)) {
         // respond with entity
      } else {
         // respond with HTML
      }
   }
}

不过,您最初的想法可以实现。 您可以在资源类中注入HttpServletRequest ,并使用setAttribute()方法在当前请求的上下文中存储application/pdf字符串。 以后可以使用getAttribute()方法在ExceptionMapper获得它。 但是除非绝对必要,否则我不建议您这样做。 它在代码的各个组件之间引入了不太明显的依赖关系。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM