【发布时间】:2019-06-19 19:10:00
【问题描述】:
我有两种方法。
主要方法:
@PostMapping("/login")
public Mono<ResponseEntity<ApiResponseLogin>> loginUser(@RequestBody final LoginUser loginUser) {
return socialService.verifyAccount(loginUser)
.flatMap(socialAccountIsValid -> {
if (socialAccountIsValid) {
return this.userService.getUserByEmail(loginUser.getEmail())
.switchIfEmpty(insertUser(loginUser))
.flatMap(foundUser -> updateUser(loginUser, foundUser))
.map(savedUser -> {
String jwts = jwt.createJwts(savedUser.get_id(), savedUser.getFirstName(), "user");
return new ResponseEntity<>(HttpStatus.OK);
});
} else {
return Mono.just(new ResponseEntity<>(HttpStatus.UNAUTHORIZED));
}
});
}
而这个被调用的方法(服务调用外部api):
public Mono<User> getUserByEmail(String email) {
UriComponentsBuilder builder = UriComponentsBuilder
.fromHttpUrl(USER_API_BASE_URI)
.queryParam("email", email);
return this.webClient.get()
.uri(builder.toUriString())
.exchange()
.flatMap(resp -> {
if (Integer.valueOf(404).equals(resp.statusCode().value())) {
return Mono.empty();
} else {
return resp.bodyToMono(User.class);
}
});
}
在上面的例子中,switchIfEmpty() 总是从 main 方法中调用,即使返回了带有 Mono.empty() 的结果。
我找不到这个简单问题的解决方案。
以下也不起作用:
Mono.just(null)
因为该方法会抛出一个NullPointerException。
我也不能使用 flatMap 方法来检查 foundUser 是否为空。
遗憾的是,如果我返回 Mono.empty(),则根本不会调用 flatMap,因此我也无法在此处添加条件。
@SimY4
@PostMapping("/login")
public Mono<ResponseEntity<ApiResponseLogin>> loginUser(@RequestBody final LoginUser loginUser) {
userExists = false;
return socialService.verifyAccount(loginUser)
.flatMap(socialAccountIsValid -> {
if (socialAccountIsValid) {
return this.userService.getUserByEmail(loginUser.getEmail())
.flatMap(foundUser -> {
return updateUser(loginUser, foundUser);
})
.switchIfEmpty(Mono.defer(() -> insertUser(loginUser)))
.map(savedUser -> {
String jwts = jwt.createJwts(savedUser.get_id(), savedUser.getFirstName(), "user");
return new ResponseEntity<>(HttpStatus.OK);
});
} else {
return Mono.just(new ResponseEntity<>(HttpStatus.UNAUTHORIZED));
}
});
}
【问题讨论】:
-
我不确定这句话是否正确。
switchIfEmpty() is always called from the main method, even when a result with Mono.empty() is returned.。它的意思是被称为不是吗? -
你能详细说明你的问题吗? ''switchIfEmpty() 总是从 main 方法调用,即使返回 Mono.empty() 的结果''。这是预期的行为。
-
@Barath 我想要实现的是,如果外部服务返回404,我可以从服务层返回一个值为
null的Mono,可以通过main方法处理。我想我也可以抛出一个错误,但我不想这样做。 404应该在服务层处理,当找不到用户时,这是我觉得应该用if处理的应用程序逻辑,而不是通过异常处理。我将在文档中查看switfhIfEmpty。还是可行的建议? -
@PrashantPandey 请参阅上面的评论。
-
@Trace,您的代码仍然有效,如果 404,您将返回
Mono.empty(),它将调用switchIfEmpty。无论如何,如果您想处理错误(如果这是您正在寻找的内容),那么您可以使用onErrorResume()并进行适当处理,或者您也可以使用onErrorReturn()。 guide
标签: java spring-boot reactive-programming spring-webflux project-reactor