获取在 ExceptionMapper 中抛出异常的方法的 @Produces 注释

Posted

技术标签:

【中文标题】获取在 ExceptionMapper 中抛出异常的方法的 @Produces 注释【英文标题】:Get @Produces annotation of method that threw Exception in ExceptionMapper 【发布时间】:2017-07-04 22:41:30 【问题描述】:

我正在使用JAX-RS ExceptionMapper 来捕获应用程序异常并返回自定义输出。问题是,在映射器的上下文中,如果用户没有提供 Accept 标头,我不知道要返回什么类型的输出(例如 html 与 JSON)。目前,该代码使用基于UriInfo 请求路径的可怕黑客攻击来确定选择哪种媒体类型。理想情况下,媒体类型应该与引发异常的方法上的 @Produces 注释相同,但我无法找到任何方法在 ExceptionMapper 中获取该注释。

这可能吗,还是有其他方法可以返回合理的媒体类型?

其他答案:

This answer 建议使用 httpHeaders.getMediaType(),它返回传入请求的媒体类型,如果没有请求正文,则返回 null,因此对 GET 请求没有帮助。

这是一个 implementation,基于下面 peeskillet 的回答。

【问题讨论】:

拒绝这个问题而不解释它有什么问题是非常无益的。我已经多次阅读该问题以寻找问题,但对我来说似乎很好。 【参考方案1】:

您可以将ResourceInfo 注入映射器。在那里,您可以获得被调用的Method 和类。您可以通过一些反射检查注释。

Method method = resourceInfo.getResourceMethod();
Class cls = resourceInfo.getResourceClass();
String[] mediaTypes;
Produces produces = method.getAnnotation(Produces.class);
if (produces == null) 
    produces = cls.getAnnotation(Produces.class);

if (produces != null) 
    mediaTypes = produces.value();
 else 
    mediaType = defaultMediaTypes;

【讨论】:

谢谢,我根据您对 OQ 的回答添加了一个实现。

以上是关于获取在 ExceptionMapper 中抛出异常的方法的 @Produces 注释的主要内容,如果未能解决你的问题,请参考以下文章

捕获在不同线程中抛出的异常

Discord.NET - 获取命令中抛出了哪种类型的异常

使用 sbt 和 testng 时,如何获取测试中抛出的异常的完整堆栈跟踪?

并发.futures.ThreadPoolExecutor的使用总是在aws lambda中抛出超时异常

在 finally 块中抛出异常

在Scala中抛出异常,啥是“官方规则”