项目反应堆条件验证
Project Reactor verification of conditions
告诉我如何在 Reactive 中处理条件。
我有简单的 DTO SignInRequest 和 signIn 方法。
public class SignInRequest {
private String userName;
private String password;
}
public Mono<SignInResponse> signIn(SignInRequest signInRequest) {
boolean isValid = StringUtils.isEmailValid(signInRequest.getUserName());
return userService.findByEmail(signInRequest.getUserName())
.switchIfEmpty(Mono.error(new NotFoundException("User not found [email: " + signInRequest.getEmail() + "]")))
.filter(user -> passwordService.validatePassword(user.getPassword(), signInRequest.getPassword()))
.switchIfEmpty(Mono.error(new BadRequestException("Wrong email or password")))
.flatMap(this::generateTokens);
}
如何正确实现以下逻辑。
如果isValid == true
则调用findByEmail 方法。否则,调用 findByUsername
反应器链中没有 if-else,但我们可以让它像这样工作。
Mono.fromSupplier(() -> StringUtils.isEmailValid(signInRequest.getUserName()))
.filter(o -> o)
.flatMap(o -> userService.findByEmail(signInRequest.getUserName()))
.switchIfEmpty(userService.findByUsername(signInRequest.getUserName()))
...
就我个人而言,我认为最易读的实现如下:
public Mono<SignInResponse> signIn(SignInRequest signInRequest) {
return Mono
.fromSupplier(() -> StringUtils.isEmailValid(signInRequest.getUserName()))
.flatMap(isValid ->
isValid ? userService.findByEmail(signInRequest.getUserName())
: userService.findByUsername(signInRequest.getUserName())
)
.switchIfEmpty(Mono.error(new BadRequestException("Wrong email or password")))
.flatMap(this::generateTokens);
}
告诉我如何在 Reactive 中处理条件。
我有简单的 DTO SignInRequest 和 signIn 方法。
public class SignInRequest {
private String userName;
private String password;
}
public Mono<SignInResponse> signIn(SignInRequest signInRequest) {
boolean isValid = StringUtils.isEmailValid(signInRequest.getUserName());
return userService.findByEmail(signInRequest.getUserName())
.switchIfEmpty(Mono.error(new NotFoundException("User not found [email: " + signInRequest.getEmail() + "]")))
.filter(user -> passwordService.validatePassword(user.getPassword(), signInRequest.getPassword()))
.switchIfEmpty(Mono.error(new BadRequestException("Wrong email or password")))
.flatMap(this::generateTokens);
}
如何正确实现以下逻辑。
如果isValid == true
则调用findByEmail 方法。否则,调用 findByUsername
反应器链中没有 if-else,但我们可以让它像这样工作。
Mono.fromSupplier(() -> StringUtils.isEmailValid(signInRequest.getUserName()))
.filter(o -> o)
.flatMap(o -> userService.findByEmail(signInRequest.getUserName()))
.switchIfEmpty(userService.findByUsername(signInRequest.getUserName()))
...
就我个人而言,我认为最易读的实现如下:
public Mono<SignInResponse> signIn(SignInRequest signInRequest) {
return Mono
.fromSupplier(() -> StringUtils.isEmailValid(signInRequest.getUserName()))
.flatMap(isValid ->
isValid ? userService.findByEmail(signInRequest.getUserName())
: userService.findByUsername(signInRequest.getUserName())
)
.switchIfEmpty(Mono.error(new BadRequestException("Wrong email or password")))
.flatMap(this::generateTokens);
}