繁体   English   中英

无法通过 CRUD 应用程序中的@ControllerAdvice 和@ExceptionHandler 捕获异常

[英]Cannot catch the exception through @ControllerAdvice and @ExceptionHandler in CRUD application

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

@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));
}

还有我的 controller:

@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 代码。 你能给我一些建议吗——我怎样才能捕捉到这个异常?

看起来逻辑上有错误:在我看来, databaseUser始终为 false。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM