java - 获取 ExceptionMapper 中抛出异常的方法的 @Produces 注解

标签 java rest exception jax-rs media-type

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

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

其他答案:

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

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

最佳答案

您可以注入(inject)ResourceInfo进入映射器。在那里您可以获得被调用的方法和类。您可以通过一些反射(reflection)来检查注释。

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

关于java - 获取 ExceptionMapper 中抛出异常的方法的 @Produces 注解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42263467/

相关文章:

rest - 如何使用 Airflow DAG 调用 REST 端点

javascript - 如何在AngularJS上制作像 '/category/category_name/product_name'这样的url

ios - 如何让 CoreAnimation 在动画过程中不忽略异常?

linux - 被 ptrace 中断的 CPU 上下文在哪里,用户空间堆栈还是内核堆栈?

java - Android Studio向其他 Activity 发送变量并同时打开 Activity

java - 使用不同的字符和模式分割字符串

java - 如何在 IntelliJ 中获取源代码以使用部分包含在 JAR 中、部分包含在目录中的包

java - 如何确定异常处理程序的响应状态?

用于在字符编码之间进行转换的 Java 库

Java 创建具有特定状态代码的自定义异常类