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类,并能够在浏览器中看到自定义错误响应.
我扔了 Jersey 代码,看起来这就是 Jersey 的工作方式,在我看来,它在 Tomcat 上工作得很好只是一个巧合。Jersey 按以下方式处理验证(可能不仅仅是验证)错误:
org.glassfish.jersey.message.internal.CommittingOutputStream#flushBuffer(布尔值)
将 JSON 错误消息写入 Servlet OutputStream;
org.glassfish.jersey.servlet.internal.ResponseWriter#commit()
调用HttpServletResponse#sendError(int, String),根据 Servlet 规范:
...如果数据已写入响应缓冲区,但未返回给客户端(即响应未提交),则必须清除响应缓冲区中的数据并用这些方法设置的数据替换...
因此 Grizzly 会清除带有 JSON 错误的缓冲区,并将其替换为默认错误页面。
我建议向 Jersey 问题跟踪器提出问题 https://java.net/jira/browse/JERSEY
| 归档时间: |
|
| 查看次数: |
1919 次 |
| 最近记录: |