如何在 Spring 引导 FilterHandlerFunction 中提交之前处理响应
How to handle response before commit in Spring boot FilterHandlerFunction
我们正在将旧的 spring 应用程序迁移到 spring boot 2.0。
目前我们有一个拦截器,它作为链中的第一个执行并执行以下操作:
- 在
ThreadLocal
中设置唯一 ID
- 在提交响应之前,唯一标识从本地线程中删除。
我正在尝试找出一种在 Spring WebFlux 中实现它的方法。我可以使用 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);
}
}
这里是你如何做到的,虽然我在这里使用请求属性:
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 模型不同,请求不绑定到特定线程。请求处理可以在任何给定时间跳到不同的线程。
Reactor provides a Context
API for those uses cases.
根据您的实际用例(我不确定此事务 ID 在这里可能意味着什么),您还可以查看 Spring Cloud Sleuth and Micrometer 以及他们如何在各自的用例中解决该问题.
我们正在将旧的 spring 应用程序迁移到 spring boot 2.0。
目前我们有一个拦截器,它作为链中的第一个执行并执行以下操作:
- 在
ThreadLocal
中设置唯一 ID
- 在提交响应之前,唯一标识从本地线程中删除。
我正在尝试找出一种在 Spring WebFlux 中实现它的方法。我可以使用 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);
}
}
这里是你如何做到的,虽然我在这里使用请求属性:
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 模型不同,请求不绑定到特定线程。请求处理可以在任何给定时间跳到不同的线程。
Reactor provides a Context
API for those uses cases.
根据您的实际用例(我不确定此事务 ID 在这里可能意味着什么),您还可以查看 Spring Cloud Sleuth and Micrometer 以及他们如何在各自的用例中解决该问题.