【问题标题】:Cannot catch the exception through @ControllerAdvice and @ExceptionHandler in CRUD application无法通过 CRUD 应用程序中的@ControllerAdvice 和@ExceptionHandler 捕获异常
【发布时间】:2022-12-02 21:30:36
【问题描述】:

我正在尝试创建自定义异常处理程序,但它没有捕获我的异常(UserAlreadyExistsException;UserNotFoundException 运行良好)。我读了另一个问题,但这些建议并没有帮助我。 我的控制器建议类如下:

@RestControllerAdvice
public class UserExceptionHandler extends ResponseEntityExceptionHandler {

    private ResponseEntity<ErrorDTO> handleCommonHelper(final Exception exception, final HttpStatus status) {
        final var errorDto = new ErrorDTO();
        errorDto.setCode(String.valueOf(status.value()));
        errorDto.setErrorDetails(exception.getMessage());
        return new ResponseEntity<>(errorDto, status);
    }

    @ExceptionHandler(value = {UserNotFoundException.class})
    public ResponseEntity<ErrorDTO> handleUserNameNotFoundConflict(final UserNotFoundException e) {
        return this.handleCommonHelper(e, HttpStatus.NOT_FOUND);
    }

    @ExceptionHandler(value = {UserAlreadyExistsException.class})
    public ResponseEntity<ErrorDTO> handleUserNameExistsConflict(final UserAlreadyExistsException e) {
        return this.handleCommonHelper(e, HttpStatus.CONFLICT);
    }
}

我的方法 create 如下所示:

 @Override
public UserDTO createUser(UserDTO userDTO) {
    var databaseUser = userRepository.existsById(Long.valueOf(userDTO.getUsername()));
    if (databaseUser) {
        throw new UserAlreadyExistsException("User with this username already exists!");
    }
    userDTO.setId(null);
    var userEntity = mapToUserEntity(userDTO);
    return mapToUserDTO(userRepository.save(userEntity));
}

还有我的控制器:

@ApiResponses(value = {
        @ApiResponse(responseCode = "201", description = "Created")
        @ApiResponse(responseCode = "400", description = "Client error"),
        @ApiResponse(responseCode = "500", description = "Server error")
})
@Operation(summary = "Creation of user", description = "Creation of user")
@PostMapping("/users")
public ResponseEntity<UserDTO> createUser(@RequestBody UserDTO userDTO) {
    var createdUser = userService.createUser(userDTO);
    return new ResponseEntity<>(createdUser, HttpStatus.CREATED);
}

好吧,现在我可以用相同的用户名创建多个用户并获得 201 代码。 你能给我一些建议吗——我怎样才能捕捉到这个异常?

【问题讨论】:

    标签: java rest exception post


    【解决方案1】:

    看起来逻辑上有错误: 在我看来,databaseUser 总是错误的。

    var databaseUser = userRepository.existsById(Long.valueOf(userDTO.getUsername()));
        if (databaseUser) {
    

    您尝试通过 Id 从数据库中获取用户,但您使用的是用户名。 看起来应该是这样的:

    var databaseUser = userRepository.existsByUsername(userDTO.getUsername()); 
    

    您必须通过用户字段的唯一性来检查用户是否存在(如果在您的系统中用户名是唯一的,则必须通过用户名进行检查)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-04
      • 1970-01-01
      • 2021-04-25
      • 2018-12-02
      • 2017-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多