Jersey returns 404 有任何错误状态代码?

Jersey returns 404 with any error status code?

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

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

我是这样测试的:

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

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

Expected status code <409> doesn't match actual status code <404>.

更多代码会出现这种情况:400、500... 除了 200。

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

发生了什么事?

当存在错误状态(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 引导)您可以将其添加到 application.properties 文件中。

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

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

@EnableAutoConfiguration(exclude = { ErrorMvcAutoConfiguration.class })