Java RestEasy在资源引发异常时重置所有标头
在启用Cors的jBoss服务器中使用resteasy JAXR时,我发现了一些奇怪的事情。以下是设置: 我们的服务器将transactioncompany.com的CorsFilter(v1.3.2)作为servlet过滤器启用,以启用CORS并将适当的CORS头添加到HttpServletResponse对象 服务器本身使用resteasy jaxrs(v2.3.2.Final)为JSON端点提供服务,为我们的应用程序提供动力,显然运行在一个单独的域上 问题是,如果我的一个端点方法生成任何类型的异常(NPE、UnauthorizedException、InternalServerErrorException),作为准备响应的一部分,RestEasy会进行调用Java RestEasy在资源引发异常时重置所有标头,java,cors,resteasy,Java,Cors,Resteasy,在启用Cors的jBoss服务器中使用resteasy JAXR时,我发现了一些奇怪的事情。以下是设置: 我们的服务器将transactioncompany.com的CorsFilter(v1.3.2)作为servlet过滤器启用,以启用CORS并将适当的CORS头添加到HttpServletResponse对象 服务器本身使用resteasy jaxrs(v2.3.2.Final)为JSON端点提供服务,为我们的应用程序提供动力,显然运行在一个单独的域上 问题是,如果我的一个端点方法生成任何类
(HttpServletResponse)response.reset()
这会清除我的CORS标题。这会使Chrome正确地表现为应该取消请求。这对于需要这些错误代码的前端开发人员来说真的很不方便
两个问题:
事实上,我很惊讶地看到,您遇到了这种行为,因为我从未见过它,而且在我的日子里,我确实产生了很多异常
不管怎样,请考虑编写自定义<代码>异常映射器< /代码>。您可以使用CORS标题填充响应,并将其从
返回到response
,同时返回相应的错误信息。我也遇到了这个问题,我通过使用响应包装器找到了解决方法
class CorsHeaderResponseWrapper extends HttpServletResponseWrapper{
public CorsHeaderResponseWrapper(HttpServletResponse resp) {
super(resp);
setCorsHeader();
}
void setCorsHeader(){
HttpServletResponse resp = (HttpServletResponse)getResponse();
//set cors header here
}
public void reset(){
super.reset();
//set again if anyone reset it
setCorsHeader();
}
}
调用doFilter时
chain.doFilter(req, new CorsHeaderResponseWrapper(resp));
的确,我可以在异常映射器中重置头部,但这与CORS servlet过滤器完成的逻辑是重复的。我不想那样做,但这可能是唯一的办法。您的评论表明某些其他配置不正确,但我已经跟踪了代码,发现任何“未捕获”异常都包含对response.reset()的调用。