我使用Spring Boot和Data JPA 我有以下代码。
具有姓名和信息性消息的用户类。
class UserResponse{
private String name;
private String message;
}
User JPA Repository,它找到userBy id;
interface UserRepository{
Optional<User> findUserById(String id);
}
用户服务,如果找不到用户,则调用repo并设置消息
class UserService(){
UserResponse user = new UserResponse();
public UserResponse getUserById(String userId){
Optional<User> useroptional = userRepository.findById(userId);
if(userOptional.isPresent()){
user.setName(userOptional.get().getName());
}else{
user.setMessage("User Not Found");
}
}
UserController必须根据消息设置正确的HTTP状态代码。
class UserController(){
public ResponseEntity<UserResponse> getUserById(String id){
UserResponse user = userService.getUserById(id);
HttpStatus status = OK;
if(!StringUtils.isEmpty(user.getMessage())){
status = NOT_FOUND;
}
return new ResponseEntity<>(user,status);
}
}
我遇到的问题是为了在控制器层设置正确的状态代码我必须检查用户消息,我不喜欢。 无论如何我们可以为成功和失败案例创建一个控制流程。
Say One返回类型和成功方案的流程,反之亦然。
我知道Scala具有任一关键字的此功能。
Java中有替代品吗?
或者我可以用来处理这个问题的任何其他方法......
一种方法是使用正确的状态代码返回服务层本身的RepsonseEntity,但设置状态代码是控制器,责任就是我的感受。
答案 0 :(得分:-1)
如果失败,您可以使用正确的消息抛出自定义Exception
。然后你可以在@ControllerAdvice
中捕获它。我马上就会添加一个例子。
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MyCustomException.class)
public ResponseEntity<String> exception(MyCustomException e) {
return new ResponseEntity(e.getMessage(), HttpStatus.NotFound);
}
}
在一个@ControllerAdvice
中,可以有更多方法侦听不同的Exception
。自定义异常可以保存你想要的任何东西 - 它是一个普通的类 - 所以你可以返回任何你想要的ResponseEntity
。
答案 1 :(得分:-1)
例如:
@Transactional(readOnly = true)
@GetMapping("/{id}")
public ResponseEntity<?> getUserById(@PathVariable("id") String userId) {
return userRepository.findById(userId)
.map(user -> ResponseEntity.ok().body(user))
.orElse(new ResponseEntity<>(/* new ErrorMessage */, HttpStatus.NOT_FOUND))
}
对于“未找到”响应,您必须创建一个错误消息对象并将其返回给客户端。