php小编香蕉介绍,spring boot webflux是一种基于响应式编程的web框架,提供了一种异步非阻塞的方式处理http请求。然而,有时候我们可能会遇到webfilter不起作用的问题。webfilter是用于在请求进入web应用程序之前或之后执行某些操作的组件。本文将探讨可能导致webfilter不起作用的原因,并提供解决方案,以确保webfilter在spring boot webflux中正常工作。
问题内容
我有下面的控制器,它返回字符串的 mono
@restcontroller
@requestmapping("api/v1/test")
public class testcontroller {
@postmapping
public mono getdraft() {
return mono.just("ok");
}
}
我添加了bean webfilter来在请求到来时进行一些处理,问题是bean中的消息没有显示在控制台中,我尝试添加断点来调试,但是当我测试api时却没有停在断点处。在 actuator/beans 中,我找到了 bean slf4jmdcfilter。还有另一个配置要添加吗?
用 php + mysql 驱动的在线商城系统,我们的目标为中国的中小企业及个人提供最简洁,最安全,最高效的在线商城解决方案,使用了自建的会员积分折扣功能,不同的会员组有不同的折扣,让您的商店吸引更多的后续客户。 系统自动加分处理功能,自动处理会员等级,免去人工处理的工作量,让您的商店运作起来更方便省事 采用了自建的直接模板技术,免去了模板解析时间,提高了代码利用效率 独立开发的购物车系统,使用最
@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 filter(ServerWebExchange exchange, WebFilterChain chain) {
return Mono.deferContextual(contextView -> chain.filter(exchange)
.contextWrite(context -> context.put("KEY", "VALUE")));
}
}
// controller
@Override
public Mono testApi(ServerWebExchange exchange) {
return Mono.just("OK")
.transformDeferredContextual((data, context) -> {
log.info("context is {}", (Object) context.get("KEY"));
return data;
});
}









