Я хочу обработать исключение глобально и вернуть пользовательское сообщение об ошибке, используя класс 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"
}