V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jamel
V2EX  ›  Java

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

  •  
  •   jamel · 2022-07-15 11:11:44 +08:00 · 1553 次点击
    这是一个创建于 622 天前的主题,其中的信息可能已经有所发展或是发生改变。
    
            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 类型,失败。。。
    第二种如上,失败。。。

    4 条回复    2022-07-15 16:29:34 +08:00
    jamel
        1
    jamel  
    OP
       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
        2
    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
        3
    jamel  
    OP
       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
        4
    Real00  
       2022-07-15 16:29:34 +08:00
    注意 bodyMono 可能为空会导致 .map 后续不执行,考虑兜底处理异常或者 XXIfEmpty
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4549 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 10:06 · PVG 18:06 · LAX 03:06 · JFK 06:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.