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

mwn*_*man 4 grizzly jersey-2.0

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

提前致谢,

迈克诺曼

Tom*_*Tom 11

之后寻找到的代码到阿列克谢指出,为新泽西2.13,我发现有问题的代码路径可以通过设置属性来避免jersey.config.server.response.setStatusOverSendError"true".

因此,作为一个解决方法,直到JERSEY-2673修复,我只是放入property(ServerProperties.RESPONSE_SET_STATUS_OVER_SEND_ERROR, "true");我的ResourceConfig类,并能够在浏览器中看到自定义错误响应.


ale*_*xey 1

我扔了 Jersey 代码,看起来这就是 Jersey 的工作方式,在我看来,它在 Tomcat 上工作得很好只是一个巧合。Jersey 按以下方式处理验证(可能不仅仅是验证)错误:

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

    将 JSON 错误消息写入 Servlet OutputStream;

  2. org.glassfish.jersey.servlet.internal.ResponseWriter#commit()

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

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

    因此 Grizzly 会清除带有 JSON 错误的缓冲区,并将其替换为默认错误页面。

我建议向 Jersey 问题跟踪器提出问题 https://java.net/jira/browse/JERSEY