我使用JAX-RS ExceptionMapper来捕获应用程序异常并返回自定义输出。问题是在映射器的上下文中,如果用户没有提供Accept
标头,我就不知道要返回什么类型的输出(例如HTML与JSON)。目前,代码使用基于UriInfo请求路径的可怕黑客来确定选择的媒体类型。理想情况下,媒体类型应该与抛出异常的方法上的@Produces注释相同,但我还没有找到任何方法在ExceptionMapper
中获取该注释。< / p>
这是可能的,还是有其他方法可以返回合理的媒体类型?
其他答案:
This answer建议使用httpHeaders.getMediaType(),它返回传入请求的媒体类型;如果没有请求主体,则返回null,因此对GET请求没有帮助。
以下是基于peeskillet的答案的implementation。
答案 0 :(得分: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;
}