首页 > 解决方案 > ServerResponseFilter 未应用于 GET

问题描述

我有一个具有以下过滤器定义的 Quarkus 应用程序:


@ApplicationScoped
@Slf4j
public class Filters {


// some @Inject parameters i'm using

  @ServerRequestFilter(preMatching = true)
  public void requestLoggingFilter(ContainerRequestContext requestContext) {
    log.info("Recv: [{}] {}, {}", requestContext.getHeaderString("myHeader"), requestContext.getMethod(), requestContext.getUriInfo().getRequestUri());
  }



  @ServerResponseFilter
  public void responseBasicHeaderFilter(ContainerResponseContext responseContext) {
    responseContext.getHeaders().putSingle("myHeader, "myValue");
  }

  @ServerResponseFilter
  public void responseLoggingFilter(ContainerResponseContext responseContext) {
    log.info("Sent: [{}] {} {}", responseContext.getHeaderString("myHeader"), , responseContext.getStatusInfo(), responseContext.getEntity());
  }
}

我有两个测试:测试类配置:

@QuarkusTest
public class MyTest {
...
}

测试一:

  final Response response = given()
        .post(BASE_URL)
        .then()
        .extract().response();
    assertEquals(200, response.getStatusCode(), () -> "Got: " + response.prettyPrint());
    assertEquals("myValue", response.getHeader("myHeader"));

  final Response response2 = given()
        .get(BASE_URL)
        .then()
        .extract().response();
    assertEquals(200, response2.getStatusCode(), () -> "Got: " + response2.prettyPrint());
    assertEquals("myValue", response2.getHeader("myHeader"));

测试 B:

  final Response response = given()
        .post(BASE_URL)
        .then()
        .extract().response();
    assertEquals(200, response.getStatusCode(), () -> "Got: " + response.prettyPrint());
    assertEquals("myValue", response.getHeader("myHeader"));

如果我自己运行测试 B,它会通过。

如果我运行测试 A,但是最后一个断言失败(标题值不存在)。

@ServerResponseFilter似乎没有超过第一次调用,但似乎@ServerRequestFilter很好。

我已经手动测试了 api 并且可以确认相同的行为。首先调用 GET 请求也将具有相同的行为。

我已经验证我的 Controller (pojo) 生成的响应是成功生成的。

是什么阻止了它重新运行?

标签: javafilterjax-rsquarkus

解决方案


原来它与 GET 与 POST 无关

我的 GET 方法返回一个 Multi 。我将它转换为 Uni> 并且它起作用了。

从文档中我发现了这个片段

Reactive developers may wonder why we can't return a stream of fruits directly. It tends to eb a bad idea with a database....

关键字是we can't所以我想这是不支持的功能


推荐阅读