Spring boot WebFlux:WebFilter 不起作用

问题描述 投票:0回答:1

我有下面的控制器,它返回一个 Mono 字符串

@RestController
@RequestMapping("api/v1/test")
public class TestController {

    @PostMapping
    public Mono<String> getDraft() {
        return Mono.just("ok");
    }

}

我添加了bean WebFilter来在请求进来时做一些处理,问题是bean中的消息没有显示在控制台中,我尝试添加一个断点来调试,但是当我测试api时它没有停止断点。在

actuator/beans
中我找到了豆子
slf4jMdcFilter
。还有另一个配置要添加吗?

@Configuration
public class WebConfig {

    public static final String TRX_ID = "transactionId";
    public static final String PATH_URI = "pathUri";

    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    WebFilter slf4jMdcFilter() {
        return (exchange, chain) -> {
            System.out.println("Filtering request");
            String requestId = exchange.getRequest().getId();
            return chain.filter(exchange)
                    .contextWrite(Context.of(TRX_ID, requestId)
                            .put(PATH_URI, exchange.getRequest().getPath()));
        };
    }

}
java spring-boot spring-webflux
1个回答
0
投票

这可以通过使用 deferContextual(Function) 来实现 & transformDeferredContextual(BiFunction)


@Component
public class YourFilter implements WebFilter {

  @Override
  public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
    return Mono.deferContextual(contextView -> chain.filter(exchange)
        .contextWrite(context -> context.put("KEY", "VALUE")));
  }
}

// controller
 @Override
  public Mono<String> testApi(ServerWebExchange exchange) {
    return Mono.just("OK")
        .transformDeferredContextual((data, context) -> {
          log.info("context is {}", (Object) context.get("KEY"));
          return data;
        });
  }
© www.soinside.com 2019 - 2024. All rights reserved.