Java springbootReact性结合单核细胞

xpszyzbs  于 2023-02-07  发布在  Java
关注(0)|答案(1)|浏览(63)

我正在写一个注册入口点,它想返回一个带有id和token的dto。我试过在控制器中使用flatmap代替map,但是结果是一样的。代码有两部分,第一部分是注册(用于保存和检查用户),第二部分(查找用户id)。但是我的问题是如何Map结果,这涉及到两个单变量。
代码:

@PostMapping("/signup")
public Mono<AuthResponse> signup(@RequestBody user_info user) {
    return tokenService.signup(user)
            .doOnNext(System.out::println)
            .switchIfEmpty(Mono.error(new Error("signup not work")))
            .flatMap(token->{
                return userRespository.findByyUsername(user.getUsername())
                        .doOnNext(System.out::println)
                        .switchIfEmpty(Mono.error(new Error("finding fail")))
                        .flatMap(userInfo ->
                                Mono.just(new AuthResponse(userInfo.getId(),token)));
            });

验证响应:(日期至)

@Data
@AllArgsConstructor
public class AuthResponse {
    private Integer id;
    private String token;
}

错误输出:

2023-02-05T02:45:41.539+08:00 ERROR 147274 --- [tor-tcp-epoll-2] a.w.r.e.AbstractErrorWebExceptionHandler : [c841e0d1-1]  500 Server Error for HTTP POST "/signup"

java.lang.Error: finding fail
    at com.springboot.sohinalex.java.Controller.apigatewayController.lambda$signup$1(apigatewayController.java:51) ~[classes/:na]
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Error has been observed at the following site(s):
    *__checkpoint ⇢ Handler com.springboot.sohinalex.java.Controller.apigatewayController#signup(user_info) [DispatcherHandler]
    *__checkpoint ⇢ org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ org.springframework.security.web.server.authorization.AuthorizationWebFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ org.springframework.security.web.server.authorization.ExceptionTranslationWebFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ org.springframework.security.web.server.authentication.logout.LogoutWebFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ org.springframework.security.web.server.savedrequest.ServerRequestCacheWebFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ org.springframework.security.web.server.context.SecurityContextServerWebExchangeWebFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ org.springframework.security.web.server.authentication.AuthenticationWebFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ org.springframework.security.web.server.authentication.AuthenticationWebFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ org.springframework.security.web.server.context.ReactorContex

供参考:注册功能:

public Mono<String> signup(user_info user)  {

            log.info("signup start");
            return Mono.just(user).doOnNext(System.out::println)
                    .switchIfEmpty(Mono.error(new RuntimeException()))
                         .flatMap(Monouser->{
                     Mono<Boolean> isuserexist=IsUsernameExist(Monouser.getUsername())
                             .doOnNext(System.out::println)
                             .switchIfEmpty(Mono.just(false))  //no user found => can register
                             .mapNotNull(res-> res
                             );
                     Monouser.setPassword(  //encode the password
                                     passwordEncoder.encode(user.getPassword()));
                     Mono<user_info> savedusr = respository.save(
                     Monouser).log();

                            return isuserexist.doOnNext(System.out::println) //check the username exist in my db
                                    .switchIfEmpty(Mono.error(new RuntimeException()))
                                    .flatMap(
                                    res->{
                                        log.info("start the map");
                                        if(res){
                                        log.info("error");
                                        return null;
                                    }
                                    else {
                                            savedusr.subscribe();//execute the saving user
                                            log.info("check");
                                       return  reactiveAuthenticationManager.authenticate(
                                                new UsernamePasswordAuthenticationToken(
                                                        user.getUsername(),user.getPassword()
                                                )
                                        ).map(this::generateToken);

                                    }
                                    }
                            );
hmae6n7t

hmae6n7t1#

我已经改变了注册服务,而不是返回的Authrespond与嵌套flatmap内的服务,它返回我想要的。使用嵌套flatmap获得两个变量,并返回它。这里为您提供参考,欢迎任何建议:注册控制器:

@PostMapping("/signup")
public Mono<AuthResponse> signup(@RequestBody user_info user) {
    return tokenService.signup(user);
}

注册服务:

public Mono<AuthResponse> signup(user_info user) {

            log.info("signup start");
            // convert IsUserexist to boolean
            
            Mono<Boolean> isuserexist=IsUsernameExist(user.getUsername())
                    .doOnNext(System.out::println)
                    .switchIfEmpty(Mono.just(false))  //no user found => can register
                    .mapNotNull(res-> res
                    );
            return isuserexist
                    .switchIfEmpty(Mono.error(new Error("cant check username exist")))
                    .doOnNext(System.out::println)
                    . flatMap(
                    nameExist->{   //check username exist 
                        if(nameExist){
                            log.info("repeated");
                            return Mono.empty();
                        } else
                        {
                            log.info("not repeat");
                            user.setPassword(passwordEncoder.encode(user.getPassword()));    //encode the password
                            return respository.save(user)
                                    .switchIfEmpty(Mono.error(new Error("cant save user")))
                                    .doOnNext(System.out::println)
                                    .flatMap(
                                    savedUser->{
                                        log.info("user saved with id: "+savedUser.getId());
                                    return   reactiveAuthenticationManager.authenticate(
                                                new UsernamePasswordAuthenticationToken(
                                                        user.getUsername(),user.getPassword()
                                                )
                                        ). switchIfEmpty(Mono.error(new Error("cant auth")))
                                            .doOnNext(System.out::println)
                                            .flatMap(       //generate token
                                                auth->{     //return id and token
                                            String token=generateToken(auth);
                                            log.info("token generated");
                                            return Mono.just(new AuthResponse(savedUser.getId(), token));
                                    });
                                    }
                            );
                        }

相关问题