Reputation: 293
I can't seem to be able to make the following code work, for some reason neither of the following advice is being thrown to the controller, like it doesn't exist.
@ControllerAdvice
public class ExceptionHandler extends ResponseEntityExceptionHandler {
@Autowired
private MessageSource messageSource;
@Override
protected ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
String mensagemUsuario = messageSource.getMessage("mensagem.invalida", null, LocaleContextHolder.getLocale());
String mensagemDesenvolvedor = ex.getCause().toString();
List<Erro> erros = Arrays.asList(new Erro(mensagemUsuario, mensagemDesenvolvedor));
return handleExceptionInternal(ex, erros, headers, HttpStatus.BAD_REQUEST, request);
}
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
List<Erro> erros = criarListaDeErros(ex.getBindingResult());
return handleExceptionInternal(ex, erros, headers, HttpStatus.BAD_REQUEST, request);
}
private List<Erro> criarListaDeErros(BindingResult bindingResult) {
List<Erro> erros = new ArrayList<>();
for (FieldError fieldError : bindingResult.getFieldErrors()) {
String mensagemUsuario = messageSource.getMessage(fieldError, LocaleContextHolder.getLocale());
String mensagemDesenvolvedor = fieldError.toString();
erros.add(new Erro(mensagemUsuario, mensagemDesenvolvedor));
}
return erros;
}
@org.springframework.web.bind.annotation.ExceptionHandler({EmptyResultDataAccessException.class})
@ResponseStatus(HttpStatus.NOT_FOUND)
public ResponseEntity<Object> handleEmptyResultDataAccessException(RuntimeException ex, WebRequest request){
String mensagemUsuario = messageSource.getMessage("mensagem.invalida", null, LocaleContextHolder.getLocale());
String mensagemDesenvolvedor = ex.getCause().toString();
List<Erro> erros = Arrays.asList(new Erro(mensagemUsuario, mensagemDesenvolvedor));
return handleExceptionInternal(ex, erros, new HttpHeaders(), HttpStatus.NOT_FOUND, request);
}
@org.springframework.web.bind.annotation.ExceptionHandler({DataIntegrityViolationException.class})
public ResponseEntity<Object> handleDataIntegrityViolationException(DataIntegrityViolationException ex, WebRequest webRequest) {
String mensagemUsuario = messageSource.getMessage("mensagem.invalida", null, LocaleContextHolder.getLocale());
String mensagemDesenvolvedor = ex.getCause().toString();
List<Erro> erros = Arrays.asList(new Erro(mensagemUsuario, mensagemDesenvolvedor));
return handleExceptionInternal(ex, erros, new HttpHeaders(), HttpStatus.BAD_REQUEST, webRequest);
}
public static class Erro {
private String mensagemUsuario;
private String mensagemDesenvolvedor;
public Erro(String mensagemUsuario, String mensagemDesenvolvedor) {
this.mensagemUsuario = mensagemUsuario;
this.mensagemDesenvolvedor = mensagemDesenvolvedor;
}
} }
It's my first time creating controller advice this way so would very much appreciate if someone could point me what I'm doing wrong.
Thank you.
Upvotes: 0
Views: 303
Reputation: 871
It's probably because you forgot to annotate the methods with @ExceptionHandler
@Override
@ExceptionHandler(value = { (HttpMessageNotReadableException .class})
protected ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
String mensagemUsuario = messageSource.getMessage("mensagem.invalida", null, LocaleContextHolder.getLocale());
String mensagemDesenvolvedor = ex.getCause().toString();
List<Erro> erros = Arrays.asList(new Error(mensagemUsuario, mensagemDesenvolvedor));
return handleExceptionInternal(ex, erros, headers, HttpStatus.BAD_REQUEST, request);
}
Upvotes: 1