我有一个JUnit测试套件:GrizzlyHttpServerFactory + Jersey + Bean验证 (jersey-container-grizzly2-servlet / jersey-bean-validation ver 2.12,grizzly-http-server ver 2.3.16, hibernate-validator ver 5.0.0.Final)
ValidationException生成的400个错误正在返回Grizzly的默认错误页面(html) 而不是Bean Validation的Response实体(json)。我尝试了ClientResponseFilter及其 entityStream还包含html错误页面。
当我在Tomcat下运行系统时,ValidationExceptions返回一个带有json格式的Response 实体。
关于如何配置Grizzly / Jersey / Validator以不返回错误页面(html)的任何想法 并将ValidationExceptions放入Response的entityStream中,就像Tomcat一样?
答案 0 :(得分:11)
在alexey为泽西岛2.13指向的looking into the code之后,我发现可以通过将属性jersey.config.server.response.setStatusOverSendError
设置为"true"
来避免相关的代码路径。
因此,作为修复JERSEY-2673之前的解决方法,我只是将property(ServerProperties.RESPONSE_SET_STATUS_OVER_SEND_ERROR, "true");
放入我的ResourceConfig类中,并且能够在浏览器中看到自定义错误响应。
答案 1 :(得分:1)
我抛出泽西岛代码,看起来就像泽西岛的工作方式和IMO一样巧合,它在Tomcat上运行良好。 Jersey按照以下方式处理验证(可能不仅仅是验证)错误:
org.glassfish.jersey.message.internal.CommittingOutputStream#flushBuffer(布尔值)
将JSON错误消息写入Servlet OutputStream;
org.glassfish.jersey.servlet.internal.ResponseWriter#提交()
调用 HttpServletResponse#sendError(int,String),根据Servlet规范:
...如果数据已写入响应缓冲区,但未返回给客户端(即 响应未提交),必须清除响应缓冲区中的数据 用这些方法设置的数据替换......
因此Grizzly用JSON错误清除缓冲区并将其替换为默认错误页面。
我建议提交问题@泽西岛问题跟踪器 https://java.net/jira/browse/JERSEY