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

标签 java servlets jax-rs custom-exceptions

我有一个资源:

@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
    }
}

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

最佳答案

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

下面是关于如何使 ExceptionMapper 根据 API 客户端指定(或未指定)的 Accept header 以不同格式响应的示例。

@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
      }
   }
}

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

关于java - 如何在 JAX-RS ExceptionMapper 中获取响应的内容类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46013052/

相关文章:

javascript - 如何将数据从 Java Servlet 传递到 JavaScript

java - Jboss EAP 6.1 中的 RestEasy 冲突

java - 我可以使用 web.xml 设置 Jersey 客户端的配置吗

java - 方法调用中的 Null、原始数据值和包装类

java - javax.servlet.jsp-api 的用途是什么

java - 使用 Google Contacts API Java 时出现“无身份验证 header 信息”错误

java - 将请求转发到 JSP

java - post 方法没有得到 payload 对象

java - 为什么 C++ 中的整数数组搜索循环比 Java 慢?

Java:HttpPost 到 API - ConnectTimeoutException - Apache HttpClient 4