我正在写一个注册入口点,它想返回一个带有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);
}
}
);
1条答案
按热度按时间hmae6n7t1#
我已经改变了注册服务,而不是返回的Authrespond与嵌套flatmap内的服务,它返回我想要的。使用嵌套flatmap获得两个变量,并返回它。这里为您提供参考,欢迎任何建议:注册控制器:
注册服务: