各位前辈好,因为我刚接触 Spring cloud gateway ,不太懂这个框架,想请教个问题。
我这个功能逻辑是这样的:在一个自定义的局部过滤器,通过getMultipartData()
来解析请求中的文件和字符串变量后做一些业务逻辑,然后不继续走别的过滤器,直接返回。
但是我的这份代码问题在于:
return exchange.getResponse().setComplete()
并不会触发getMultipartData()
这个流,得不到数据;return chain.filter(exchange)
,却可以触发这个流,获得数据。请问这个现象是因为什么引起呢,或者啥关键词可以提示一下?我从凌晨三四点就开始考虑这个问题了,实在无能为力。 谢谢大家。
@Slf4j
@Component
public class FileFilterGatewayFilterFactory extends
AbstractGatewayFilterFactory<FileFilterGatewayFilterFactory.ParamsConfig>{
public FileFilterGatewayFilterFactory() {
super(FileFilterGatewayFilterFactory.ParamsConfig.class);
}
@Override
public GatewayFilter apply(FileFilterGatewayFilterFactory.ParamsConfig config) {
return new OrderedGatewayFilter(((exchange, chain) -> {
parseBody(exchange).subscribe();
// 如果放行,可以触发 parseBody 里面的方法
return chain.filter(exchange);
// 如果不放行,parseBody 里面的方法根本不执行
return exchange.getResponse().setComplete();
}),10);
}
public Mono<Object> parseBody(@NotNull ServerWebExchange exchange) {
return exchange.getMultipartData().map(multipartData -> {
Map<String, Part> partMap = multipartData.toSingleValueMap();
Part file = partMap.get("file");
FormFieldPart bizName = (FormFieldPart) partMap.get("name");
return Result.buildSuccessResult("成功", null);
});
}
1
mmdsun 2023-09-09 17:39:29 +08:00
没怎么用过 spring gateway ,看了下文档,继承 ModifyRequestBodyGatewayFilterFactory 等官方提供好的类,比较好实现。不执行返回执行,可以抛个异常,然后用写个异常处理器返回错误信息。
再说代码问题,一般来说,subscribe 方法是异步的,会在另一个线程中执行反应式流,不会等待它的结果。 parseBody 不执行,可能是前线程在 subscribe()方法执行之前就结束了。 代码应该使用操作符来连接你的流,比如: return parseBody(exchange).flatMap(result -> exchange.getResponse().setComplete()); |
2
bai821547889 OP @mmdsun 😘谢谢大佬,听到您的建议,豁然开朗,代码按照您说的,问题已经解决了,真的非常感谢。👍👍👍
|