Jersey在任何错误状态码下都返回404?

11

我有一个没有用的端点,路径为"/test":

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

我是这样进行测试的:

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

但是我遇到了断言错误:

期望状态码 <409> 与实际状态码 <404> 不匹配。

这种情况在其他代码中也会发生:如400,500…除了200之外。

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

这是怎么回事?

2个回答

15
当Jersey出现错误状态(4xx,5xx)时,默认行为是使用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

1
或者您可以将它添加到 web.xml 文件中,作为 Jersey ServletContainer servlet 的 <init-param>。谢谢。 - watery
jersey.config.server.response.setStatusOverSendError是一个常量的字符串值,如果你想在web.xml中使用它。 - Paul Samsotha

4

我之前也遇到过这个问题,解决方法是从Spring Boot自动配置中排除ErrorMvcAutoConfiguration:

@EnableAutoConfiguration(exclude = { ErrorMvcAutoConfiguration.class })

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接