首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在JAX-RS ExceptionMapper中获取响应的内容类型

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

Stack Overflow用户
提问于 2017-09-02 10:56:35
回答 1查看 1.3K关注 0票数 5

我有一个资源:

代码语言:javascript
复制
@GET
@Path("/print-order")
@Produces("application/pdf")
public byte[] printOrder(@QueryParam("id") Long orderId) {
    return ...;
}

...which可以抛出与用户相关的错误,并且必须以HTML页面的形式显示。因此,我实现了一个ExceptionMapper,但我不知道如何获得被调用资源的@Produces("application/pdf")注释的值。

代码语言:javascript
复制
@Provider
public class CustomExceptionMapper implements ExceptionMapper<CustomException> {
    @Override
    public Response toResponse(CustomException exception) {
        if (contentType = "application/pdf")
            ... html respone
        else
            ... entity response
    }
}

我使用JAX-RS1.x (jsr311)和Jersy 1.12实现,但是我希望有独立于实现的解决方案。

EN

回答 1

Stack Overflow用户

发布于 2017-09-02 12:26:41

您可以将不同的上下文对象注入到ExceptionMapper中,以获得它处理的请求的更多信息。根据HTTP的Accept头(了解更多的这里)确定客户端期望的内容类型是很方便的。

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

代码语言:javascript
复制
@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字符串。它可以在ExceptionMapper中使用getAttribute()方法得到。,但除非绝对必要,否则我不建议这样做。引入了代码组件之间不太明显的依赖关系。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46013052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档