簡體   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