Java 如何在Spring boot FilterHandlerFunction中处理提交前的响应
我们正在将一个旧的spring应用程序迁移到SpringBoot2.0 目前,我们有一个拦截器,它作为链中的第一个执行,并执行以下操作:Java 如何在Spring boot FilterHandlerFunction中处理提交前的响应,java,spring-boot,spring-webflux,Java,Spring Boot,Spring Webflux,我们正在将一个旧的spring应用程序迁移到SpringBoot2.0 目前,我们有一个拦截器,它作为链中的第一个执行,并执行以下操作: 在ThreadLocal 在提交响应之前,将从本地线程中删除唯一id 我正试图找出一种在SpringWebFlux中实现这一点的方法。我可以使用WebFilter实现来实现;但是,由于我使用RouterFunction作为控制器,所以我试图检查是否有办法通过HandlerFilterFunction实现这一点 public class TxIdFilter
- 在
ThreadLocal
- 在提交响应之前,将从本地线程中删除唯一id
WebFilter
实现来实现;但是,由于我使用RouterFunction
作为控制器,所以我试图检查是否有办法通过HandlerFilterFunction
实现这一点
public class TxIdFilter implements HandlerFilterFunction<ServerResponse, ServerResponse> {
/**
* {@inheritDoc}
*/
@Override
public Mono<ServerResponse> filter(ServerRequest request, HandlerFunction<ServerResponse> next) {
/*
* How to achieve following (which can be done
* using WebFilter)
*
* exchange.getResponse().beforeCommit(() -> {
* logger.debug("Cleaning up the tx id...");
* AppTransactionContext.removeAll();
* return Mono.empty();
* });
*/
return next.handle(request);
}
}
公共类TxIdFilter实现HandlerFilterFunction{
/**
*{@inheritardoc}
*/
@凌驾
公共单声道过滤器(ServerRequest请求,HandlerFunction下一步){
/*
*如何实现以下目标(可以做到哪一点
*使用WebFilter)
*
*exchange.getResponse().beforeCommit(()->{
*logger.debug(“清理tx id…”);
*AppTransactionContext.removeAll();
*返回Mono.empty();
* });
*/
下一步返回。处理(请求);
}
}
以下是您如何做到这一点的,尽管我在这里使用了一个请求属性:
public class SampleFilterFunction implements HandlerFilterFunction {
@Override
public Mono filter(ServerRequest request, HandlerFunction next) {
request.attributes().put("key", "value");
return next.handle(request)
.doOnSuccessOrError((value, error) -> request.attributes().remove("key"));
}
}
这里不应该依赖于ThreadLocal
,因为与Servlet Spring MVC模型不同,请求不绑定到特定线程。请求处理可以在任何给定时间跳到不同的线程
根据您的实际用例(我不确定此事务ID在这里可能意味着什么),您还可以在各自的用例中查看和以及它们如何解决该问题。以下是您如何做到这一点,尽管我在这里使用了请求属性:
public class SampleFilterFunction implements HandlerFilterFunction {
@Override
public Mono filter(ServerRequest request, HandlerFunction next) {
request.attributes().put("key", "value");
return next.handle(request)
.doOnSuccessOrError((value, error) -> request.attributes().remove("key"));
}
}
这里不应该依赖于ThreadLocal
,因为与Servlet Spring MVC模型不同,请求不绑定到特定线程。请求处理可以在任何给定时间跳到不同的线程
根据您的实际用例(我不确定此事务ID在这里可能意味着什么),您还可以在各自的用例中查看和了解它们如何解决该问题。谢谢Brian;我最终使用了
doFinally
,这很有效。关于tx id,每当有请求来到我们的应用程序时,我们希望设置一个id,然后将其传递到所有层(dao、服务等),然后在响应提交之前,删除该id。这就是我们使用过滤器的原因。我完全同意你的观点;但不太确定如何在反应式应用程序中实现它(即使使用上下文API)。在这方面还有什么帮助吗?看这里:谢谢布莱恩;我最终使用了doFinally
,这很有效。关于tx id,每当有请求来到我们的应用程序时,我们希望设置一个id,然后将其传递到所有层(dao、服务等),然后在响应提交之前,删除该id。这就是我们使用过滤器的原因。我完全同意你的观点;但不太确定如何在反应式应用程序中实现它(即使使用上下文API)。还有其他帮助吗?请参见此处: