Как я могу обрабатывать исключения (например, ResourceNotFoundException, NullPointerException и т. Д.) Глобально, используя @RestControllerAdvice? - PullRequest
0 голосов
/ 31 марта 2019

Я хочу обработать исключение глобально и вернуть пользовательское сообщение об ошибке, используя класс ErrorResponse.

Вы можете предложить мне лучший подход для обработки исключений с помощью пользовательского сообщения об ошибке, используя @RestControllerAdvice вместе с ResponseEntity.

Я пытался реализовать обработчик ошибок следующим образом, но я не получал пользовательское сообщение об ошибке для исключений.

Контроллер пользователя:

@RestController
public class UserController {

    @Autowired
    UserService userService;

    @GetMapping("/users")
    public List<User> getall(){
       return userService.getAllUsers();
    }

    @GetMapping("/user/{id}")
    public User get(@PathVariable("id") String id){
       if (userService.getUser(id) == null)
            throw new ResourceNotFoundException(HttpStatus.NOT_FOUND, "User with provided Id is not found");
        return userService.getUser(id);
    }

    @PostMapping("/user/create")
    public ResponseEntity save(@RequestBody User user){
        user.setCreatedTime(LocalDate.now());
        user.setUpdatedTime(LocalDate.now());
        User savedUser = userService.createUser(user);
        URI location = ServletUriComponentsBuilder
                .fromCurrentRequest()
                .path("{id}")
                .buildAndExpand(savedUser.getId())
                .toUri();
        return ResponseEntity.created(location).build();
    }

    @PutMapping("/user/update")
    public User update(@RequestBody User user){
        user.setUpdatedTime(LocalDate.now());
        return userService.createUser(user);
    }

    @DeleteMapping("/user/delete/{id}")
    public void delete(@PathVariable("id") String id){
         userService.deleteUser(id);
    }
}

Класс ResourceNotFoundException:

public class ResourceNotFoundException extends RuntimeException {
    public ResourceNotFoundException(HttpStatus statusCode, String message){
        super(message);
    }
}

Класс CustomNullPointerException:

public class CustomNullPointerException extends NullPointerException {
    public CustomNullPointerException(HttpStatus statusCode, String message){
        super(message);
    }
}

GlobalCustomExceptionHandling class:

@RestControllerAdvice
public class GlobalCustomExceptionHandling extends ResponseEntityExceptionHandler {

    @ExceptionHandler(value = {Exception.class})
    protected ResponseEntity<ErrorMessage> handleAnyException(Exception ex, WebRequest req) {
        String errorMessageDescription = ex.getLocalizedMessage();
        if (errorMessageDescription == null)
            errorMessageDescription = ex.toString();
        ErrorMessage errorMessage = new ErrorMessage(LocalDate.now(),errorMessageDescription);
        return new ResponseEntity<>(errorMessage, new HttpHeaders(), HttpStatus.INTERNAL_SERVER_ERROR);
    }

    @ExceptionHandler(value = {ResourceNotFoundException.class})
    protected ResponseEntity<ErrorMessage> handleResourceNotFoundException(ResourceNotFoundException rnfex){
        String errorMessageDescription = rnfex.getLocalizedMessage();
        if (errorMessageDescription == null)
            errorMessageDescription = rnfex.toString();
        ErrorMessage errorMessage = new ErrorMessage(LocalDate.now(),errorMessageDescription);
        return new ResponseEntity<>(errorMessage, new HttpHeaders(), HttpStatus.NOT_FOUND);
    }

}

ErrorMessage Class:

@Data
public class ErrorMessage {
    private LocalDate timestamp;
    private String message;
    public ErrorMessage(){}

    public ErrorMessage(LocalDate timestamp, String message) {
        this.timestamp = timestamp;
        this.message = message;
    }
}

Фактический результат:

{
   "timestamp": "2019-03-31",
   "message": "User with provided Id is not found"
}

Ожидаемый результат:

{
   "timestamp": "2019-03-31",
   "status code": 404,
   "message": "User not found with Id 100"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...