【问题标题】:Jersey returns 404 with any error status code?Jersey 返回 404 并带有任何错误状态代码?
【发布时间】:2016-08-04 11:35:05
【问题描述】:

我在路径“/test”中有这个无用的端点:

@PUT
public Response doSomething() {
  return Response.status(409).build();
}

我是这样测试的:

@Test
public void uselessTest() {
  put("/test").then().assertThat().statusCode(409);
}

但是我得到一个断言错误:

预期状态代码 与实际状态代码 不匹配。

这发生在更多代码中:400、500...除了 200。

我正在使用 Spring Boot。如果我在运行测试时在端点方法中设置了一个断点,执行就会停在那里,因此测试中的请求会正确完成。如果我将状态码(在资源和测试中)更改为 200,测试通过。

发生了什么?

【问题讨论】:

    标签: spring-boot jersey jersey-2.0 rest-assured


    【解决方案1】:

    当出现错误状态(4xx、5xx)时,Jersey 的默认行为是使用 servlet 的 Response.sendError,这会导致重定向到错误页面。由于没有设置错误页面,因此导致404。

    我们可以通过设置 Jersey 属性来改变这种行为

    ServerProperties.RESPONSE_SET_STATUS_OVER_SEND_ERROR

    您可以在 ResourceConfig 子类中执行此操作

    public JerseyConfig extends ResourceConfig {
        public JerseyConfig() {
            property(ServerProperties.RESPONSE_SET_STATUS_OVER_SEND_ERROR, true);
        }
    }
    

    或者(使用 Spring Boot)您可以将其添加到您的 application.properties 文件中。

    spring.jersey.init.jersey.config.server.response.setStatusOverSendError=true
    

    【讨论】:

    • 或者您可以将其添加到 web.xml 文件中,作为您的 Jersey ServletContainer servlet 的 <init-param>。谢谢
    • jersey.config.server.response.setStatusOverSendError。如果你想在 web.xml 中使用它,那就是常量的字符串值。
    【解决方案2】:

    我也遇到了这个问题,通过从 spring boot 自动配置中排除 ErrorMvcAutoConfiguration 解决了这个问题:

    @EnableAutoConfiguration(exclude = { ErrorMvcAutoConfiguration.class })
    

    【讨论】:

      猜你喜欢
      • 2014-10-26
      • 2012-07-07
      • 1970-01-01
      • 2016-09-16
      • 2021-04-09
      • 1970-01-01
      • 2014-07-29
      • 2018-04-05
      相关资源
      最近更新 更多