sgc*_*sgc 1 java-8 spring-boot option-type
仅当传入的用户对象不存在于数据库中时才尝试保留用户。该服务通过调用用户存储库中的 findByEmail 方法返回一个Optional。就我而言,数据库中已经存在一个确切的用户,并且对象已正确返回。
但是,在我的控制器中,当我执行Optional.map(user).orElse(persistuser)时,会执行orElse部分。
我的理解是,当Optional.map返回Optional并且用户也存在时,那么orElse应该返回用户,而不是执行persistuser操作。
请帮我解决这个问题。
控制器:
@PostMapping(path = "/addUser", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Response> addUser(@RequestBody User user){
user = userService.checkIfUserExsits(user.getEmail())
.map(usr -> usr)
.orElse(userService.persistUser(user));
return respHelpers.prepareSuccessResponse(user,"Processed");
}
Run Code Online (Sandbox Code Playgroud)
服务:
public Optional<User> checkIfUserExsits(String email){
Optional<User> user = Optional.ofNullable(userRepo.findByEmail(email));
return user;
}
Run Code Online (Sandbox Code Playgroud)
存储库:
@Repository
public interface UserRepo extends JpaRepository<User, UUID> {
public User findByEmail(String email);
}
Run Code Online (Sandbox Code Playgroud)
orElse()
是一个方法,当您调用该方法时,它的参数会在执行其主体之前被评估。因此userService.persistUser(user)
总是被执行。
你应该使用orElseGet
:
user = userService.checkIfUserExsits(user.getEmail())
.map(usr -> usr)
.orElseGet(() -> userService.persistUser(user));
Run Code Online (Sandbox Code Playgroud)
这样,只有当 lambda 表达式的主体Optional
为空时才会执行。
归档时间: |
|
查看次数: |
7144 次 |
最近记录: |