转发自私人博客https://www.jgayb.cn/?p=253
Webflux 和 servlet一样body只能获取一次,解决办法也是一样的,自定义请求包装类参考大神博客
1 背景
为了测试和调试方便打印请求和返回的报文信息。一般可以通过Aop拦截controller方法或增加过滤器打印报文信息解决。
1.1 Aop方法
使用Aop的拦截controller方法,是将方法的model对象参数转成json打印出来,因为是body字符串通过httpMessageConverter转成model对象,在这里打印的话就是又转回body字符串。有点浪费性能。
1.2 增加自定义过滤器的方法
自定义过滤器的话放在第一个过滤器,在转换成对象之前就打印,这样可以减少多余的性能消耗。
2 Webflux创建请求和返回的的装饰类
2.1 Request装饰类
创建包装类PartnerServerHttpRequestDecorator继承ServerHttpRequestDecorator,在含参构造放中打印请求url,query,headers和报文信息。
@Slf4j//lombok插件
public class PartnerServerHttpRequestDecorator extends ServerHttpRequestDecorator {
private Flux<DataBuffer> body;
PartnerServerHttpRequestDecorator(ServerHttpRequest delegate) {
super(delegate);
final String path = delegate.getURI().getPath();
final String query = delegate.getURI().getQuery();
final String method = Optional.ofNullable(delegate.getMethod()).orElse(HttpMethod.GET).name();
final String headers = delegate.getHeaders().entrySet()
.stream()
.map(entry -> " " + entry.getKey() + ": [" + String.join(";", entry.getValue()) + "]")
.collect(Collectors.joining("\n"));
final MediaType contentType = delegate.getHeaders().getContentType();
if (log.isDebugEnabled()) {
log.debug("\n" +
"HttpMethod : {}\n" +
"Uri : {}\n" +
"Headers : \n" +