Bean Validation 400错误返回默认错误页面(html)而不是Response实体(json)

时间:2014-09-10 00:58:54

标签: jersey-2.0 grizzly

我有一个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一样?

提前致谢,

迈克诺曼

2 个答案:

答案 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按照以下方式处理验证(可能不仅仅是验证)错误:

  1. org.glassfish.jersey.message.internal.CommittingOutputStream#flushBuffer(布尔值)

    将JSON错误消息写入Servlet OutputStream;

  2. org.glassfish.jersey.servlet.internal.ResponseWriter#提交()

    调用 HttpServletResponse#sendError(int,String),根据Servlet规范:

      

    ...如果数据已写入响应缓冲区,但未返回给客户端(即     响应未提交),必须清除响应缓冲区中的数据     用这些方法设置的数据替换......

    因此Grizzly用JSON错误清除缓冲区并将其替换为默认错误页面。

  3. 我建议提交问题@泽西岛问题跟踪器 https://java.net/jira/browse/JERSEY