我有下面的控制器,它返回一个 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()));
};
}
}
这可以通过使用 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;
});
}