Java 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端点提供服务,为我们的应用程序提供动力,显然运行在一个单独的域上 问题是,如果我的一个端点方法生成任何类

在启用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会进行调用

(HttpServletResponse)response.reset() 
这会清除我的CORS标题。这会使Chrome正确地表现为应该取消请求。这对于需要这些错误代码的前端开发人员来说真的很不方便

两个问题:

  • RestEasy为什么要清除这些标题
  • 有没有其他人遇到过这个问题,有什么解决办法

  • 事实上,我很惊讶地看到,您遇到了这种行为,因为我从未见过它,而且在我的日子里,我确实产生了很多异常


    不管怎样,请考虑编写自定义<代码>异常映射器< /代码>。您可以使用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()的调用。