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

Java 如何在JAX-RS ExceptionMapper中获取响应的内容类型,java,servlets,jax-rs,custom-exceptions,Java,Servlets,Jax Rs,Custom Exceptions,我有一个资源: @GET @Path("/print-order") @Produces("application/pdf") public byte[] printOrder(@QueryParam("id") Long orderId) { return ...; } …这可能引发与用户相关的错误,并且必须显示为HTML页面。因此,我实现了一个ExceptionMapper,但我不知道如何获取被调用资源的@products(“application/pdf”)注释的值 @Provi

我有一个资源:

@GET
@Path("/print-order")
@Produces("application/pdf")
public byte[] printOrder(@QueryParam("id") Long orderId) {
    return ...;
}
…这可能引发与用户相关的错误,并且必须显示为HTML页面。因此,我实现了一个
ExceptionMapper
,但我不知道如何获取被调用资源的
@products(“application/pdf”)
注释的值

@Provider
public class CustomExceptionMapper implements ExceptionMapper<CustomException> {
    @Override
    public Response toResponse(CustomException exception) {
        if (contentType = "application/pdf")
            ... html respone
        else
            ... entity response
    }
}
@Provider
公共类CustomExceptionMapper实现ExceptionMapper{
@凌驾
对响应的公共响应(CustomException){
如果(contentType=“application/pdf”)
…html响应
其他的
…实体响应
}
}

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

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

下面的示例说明了如何根据API客户端指定(或未指定)的
Accept
头,使
ExceptionMapper
以不同格式响应

@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
      }
   }
}
@Provider
公共类CustomExceptionMapper实现ExceptionMapper{
//注入正在处理的请求的标头
@上下文
私有HttpHeader;
//甚至所有的请求细节
@上下文
私有HttpServletRequest;
@凌驾
对响应的公共响应(CustomException){
List acceptedTypes=headers.getAcceptableMediaTypes();
if(acceptedTypes.contains(MediaType.APPLICATION_JSON)){
//以实体回应
}否则{
//用HTML响应
}
}
}

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

感谢您的详细回答,但这不是我要问的。我没有accept头,因为它不是get请求,而是一个新的窗口链接。我已经在资源路径上有了一个临时修复程序,因此建议的setAttribute将需要更多的工作。FWIW这个答案对我非常有用,因为我从一个web搜索中找到了这个问题,试图找到这个答案所能回答的问题的答案!所以,谢谢!我不确定这是否适合投票表决。。。也许我应该发布这个问题,你应该转发你的答案。嗨@EricS,很高兴它帮助了你!我的回答解决了原始问题中指出的问题,因此向上投票是合适的(尽管问题的作者希望有其他解决方案)。@Aleksei Budiak:OP说你没有回答他提出的问题,你也没有质疑他的评论。我倾向于同意,因为他问如何获取方法的products注释的值,而不是accept头。