请教各位 V2 前辈,这种 spring reactive 的业务该怎么写

2022-07-15 11:11:44 +08:00
 jamel

        final Mono<String> bodyMono = authFeignClient.checkToken(headerValue.substring(7), authProperties.getClientId(), authProperties.getClientSecret());
        if (bodyMono.block().isEmpty()) {
            return returnData(exchange, ResponseWrapper.error(401, "认证未通过"));
        } else {
            ServerHttpRequest serverHttpRequest = request.mutate().header( "X-CONTEXT-USER", "fdsa").build();
            return chain.filter(exchange.mutate().request(serverHttpRequest).build());
        }

这种写法是错误的,不能使用 block 。
我试过 authFeignClient.checkToken 返回 String 类型,失败。。。
第二种如上,失败。。。

1596 次点击
所在节点    Java
4 条回复
jamel
2022-07-15 11:25:21 +08:00
艹,解决了。
final Mono<Void> mono = bodyMono.map(body -> {
if (StrUtil.isEmpty(body)) {
return returnData(exchange, ResponseWrapper.error(401, "认证未通过"));
}

ServerHttpRequest serverHttpRequest = request.mutate().header( "X-CONTEXT-USER", "fdsa").build();
return chain.filter(exchange.mutate().request(serverHttpRequest).build());
}).flatMap(it -> it);
ifdef
2022-07-15 11:40:17 +08:00
你没有仔细看 mono 的文档吧,mono 实现了 publisher 接口,是不能直接把 string 赋值给 mono 对象的。
使用 Mono.just(T data)来创造 mono 对象,然后再 subscribe mono 对象 emit 出来的 item.

https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html
jamel
2022-07-15 11:44:10 +08:00
@ifdef 没明白前辈的意思。我的完整代码如下
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
final Mono<String> bodyMono = authFeignClient.checkToken("test", authProperties.getClientId(), authProperties.getClientSecret());

return bodyMono.map(body -> {
if (StrUtil.isEmpty(body)) {
return returnData(exchange, ResponseWrapper.error(401, "认证未通过"));
}

ServerHttpRequest serverHttpRequest = request.mutate().header( "X-CONTEXT-USER", "fdasfdas").build();
return chain.filter(exchange.mutate().request(serverHttpRequest).build());
}).flatMap(it -> it);
}

private Mono<Void> returnData(ServerWebExchange exchange, ResponseWrapper<String> responseWrapper) {
ServerHttpResponse response = exchange.getResponse();
DataBuffer buffer = response.bufferFactory().wrap(JSONUtil.toJsonStr(responseWrapper).getBytes());
response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
response.setStatusCode(HttpStatus.OK);
return response.writeWith(Flux.just(buffer));
}
Real00
2022-07-15 16:29:34 +08:00
注意 bodyMono 可能为空会导致 .map 后续不执行,考虑兜底处理异常或者 XXIfEmpty

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/866364

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX