在这种情况下,处理由 Spring Data JPA 存储库返回的 Optional<User> 对象的好方法是什么?
What is a good way to handle an Optional<User> object returned by a Spring Data JPA repository in a situation like this?
我正在开发 Spring 启动应用程序。进入服务class 我有这个服务方法:
@Override
public User getUserById(Integer userId) {
Optional<User> retrievedUser = this.userRepository.findById(userId);
return retrievedUser.get();
}
像往常一样,它调用 Spring Data JPA findById() 方法 returning 一个 Optional对象。
我正在 returning User 对象。在这里我有以下疑问:如果 Optional 是 empty,当我执行此操作时它抛出异常:
retrievedUser.get()
那么现在...当我有一个 Optional 对象时,处理这种情况的最常见方法是什么。
之前的服务方法被调用到实现API的控制器方法中,这个:
@ApiOperation(
value = "Retrieve an user by its id",
notes = "",
produces = "application/json")
@GetMapping(value = "/{useridOrEmail}", produces = "application/json")
public ResponseEntity<User> getUserByIdOrEmail(@PathVariable("useridOrEmail") String userIdOrEmail,
@RequestParam(value="isEmail", required = false, defaultValue = "false") boolean isEmail)
throws NotFoundException {
log.info(String.format("****** Retrieve the user having ID or email: %s *******", userIdOrEmail));
User retrievedUser = null;
if(!isEmail)
retrievedUser = this.userService.getUserById(Integer.parseInt(userIdOrEmail));
else
retrievedUser = this.userService.getUserByemail(userIdOrEmail);
if (retrievedUser == null) {
String ErrMsg = String.format("The user having ID or email %s was not found", userIdOrEmail);
log.warning(ErrMsg);
throw new NotFoundException(ErrMsg);
}
return new ResponseEntity<User>(retrievedUser, HttpStatus.OK);
}
正如您在我的控制器方法中看到的那样,我正在检查上一个服务的结果是否为空,以防抛出异常。此异常由 class 扩展 ResponseEntityExceptionHandler 以创建正确响应的方式处理。
所以我的想法是更改我的服务方法,将此 retrievedUser.get() 操作放入 try catch。如果我获得异常,我的 getUserById() 服务方法将 return null 因此我的控制器方法将抛出 NotFoundException 将由 Spring.
处理的特定错误响应 return 异常
可能是一个很好的解决方案或存在更好的方法来处理这种情况?
一个好的方法是 接受 无论数据库 returns。然后控制器应该决定做什么:
Optional<User> retrievedUser = isEmail
? this.userService.getUserByemail(userIdOrEmail)
: this.userService.getUserById(Integer.parseInt(userIdOrEmail));
if (!retrievedUser.isPresent()) {
String ErrMsg = String.format("The user having ID or email %s was not found", userIdOrEmail);
log.warning(ErrMsg);
throw new NotFoundException(ErrMsg);
}
return new ResponseEntity<User>(retrievedUser.get(), HttpStatus.OK);
我会 return 来自服务的可选项然后你可以像这样很好地链接它们:
public ResponseEntity<User> getUserByIdOrEmail(@PathVariable("useridOrEmail") String userIdOrEmail,
@RequestParam(value="isEmail", required = false, defaultValue = "false") boolean isEmail)
throws NotFoundException {
log.info(String.format("****** Retrieve the user having ID or email: %s *******", userIdOrEmail));
return fetchUser(userIdOrEmail, isEmail)
.map((user) -> new ResponseEntity<User>(user, HttpStatus.OK))
.orElseThrow(() -> new NotFoundException(String.format("The user having ID or email %s was not found", userIdOrEmail)));
}
private Optional<User> fetchUser(String idOrEmail, boolean isEmail) {
return isEmail
? this.userService.getUserByemail(idOrEmail)
: this.userService.getUserById(Integer.parseInt(idOrEmail));
}
并且记录警告应该在一个常见的异常处理程序中处理,该处理程序记录所有未找到的类似方式。
我正在开发 Spring 启动应用程序。进入服务class 我有这个服务方法:
@Override
public User getUserById(Integer userId) {
Optional<User> retrievedUser = this.userRepository.findById(userId);
return retrievedUser.get();
}
像往常一样,它调用 Spring Data JPA findById() 方法 returning 一个 Optional对象。
我正在 returning User 对象。在这里我有以下疑问:如果 Optional 是 empty,当我执行此操作时它抛出异常:
retrievedUser.get()
那么现在...当我有一个 Optional 对象时,处理这种情况的最常见方法是什么。
之前的服务方法被调用到实现API的控制器方法中,这个:
@ApiOperation(
value = "Retrieve an user by its id",
notes = "",
produces = "application/json")
@GetMapping(value = "/{useridOrEmail}", produces = "application/json")
public ResponseEntity<User> getUserByIdOrEmail(@PathVariable("useridOrEmail") String userIdOrEmail,
@RequestParam(value="isEmail", required = false, defaultValue = "false") boolean isEmail)
throws NotFoundException {
log.info(String.format("****** Retrieve the user having ID or email: %s *******", userIdOrEmail));
User retrievedUser = null;
if(!isEmail)
retrievedUser = this.userService.getUserById(Integer.parseInt(userIdOrEmail));
else
retrievedUser = this.userService.getUserByemail(userIdOrEmail);
if (retrievedUser == null) {
String ErrMsg = String.format("The user having ID or email %s was not found", userIdOrEmail);
log.warning(ErrMsg);
throw new NotFoundException(ErrMsg);
}
return new ResponseEntity<User>(retrievedUser, HttpStatus.OK);
}
正如您在我的控制器方法中看到的那样,我正在检查上一个服务的结果是否为空,以防抛出异常。此异常由 class 扩展 ResponseEntityExceptionHandler 以创建正确响应的方式处理。
所以我的想法是更改我的服务方法,将此 retrievedUser.get() 操作放入 try catch。如果我获得异常,我的 getUserById() 服务方法将 return null 因此我的控制器方法将抛出 NotFoundException 将由 Spring.
处理的特定错误响应 return 异常可能是一个很好的解决方案或存在更好的方法来处理这种情况?
一个好的方法是 接受 无论数据库 returns。然后控制器应该决定做什么:
Optional<User> retrievedUser = isEmail
? this.userService.getUserByemail(userIdOrEmail)
: this.userService.getUserById(Integer.parseInt(userIdOrEmail));
if (!retrievedUser.isPresent()) {
String ErrMsg = String.format("The user having ID or email %s was not found", userIdOrEmail);
log.warning(ErrMsg);
throw new NotFoundException(ErrMsg);
}
return new ResponseEntity<User>(retrievedUser.get(), HttpStatus.OK);
我会 return 来自服务的可选项然后你可以像这样很好地链接它们:
public ResponseEntity<User> getUserByIdOrEmail(@PathVariable("useridOrEmail") String userIdOrEmail,
@RequestParam(value="isEmail", required = false, defaultValue = "false") boolean isEmail)
throws NotFoundException {
log.info(String.format("****** Retrieve the user having ID or email: %s *******", userIdOrEmail));
return fetchUser(userIdOrEmail, isEmail)
.map((user) -> new ResponseEntity<User>(user, HttpStatus.OK))
.orElseThrow(() -> new NotFoundException(String.format("The user having ID or email %s was not found", userIdOrEmail)));
}
private Optional<User> fetchUser(String idOrEmail, boolean isEmail) {
return isEmail
? this.userService.getUserByemail(idOrEmail)
: this.userService.getUserById(Integer.parseInt(idOrEmail));
}
并且记录警告应该在一个常见的异常处理程序中处理,该处理程序记录所有未找到的类似方式。