Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Retorno do erro continua sendo o Stack completo.

Springboot versão 2.1.4 Classe responsável pela personalização do retorno

package br.com.alura.config.validacao;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.http.HttpStatus;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class ErroDeValidacaoHandler {

    @Autowired
    private MessageSource messageSource;

    @ResponseStatus(code = HttpStatus.BAD_REQUEST)
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public List<ErroDeFormularioDto> handle(MethodArgumentNotValidException exception) {
        List<ErroDeFormularioDto> dto = new ArrayList<>();

        List<FieldError> fieldErrors = exception.getBindingResult().getFieldErrors();
        fieldErrors.forEach(e -> {
            String mensagem = messageSource.getMessage(e, LocaleContextHolder.getLocale());
            ErroDeFormularioDto erro = new ErroDeFormularioDto(e.getField(), mensagem);
            dto.add(erro);
        });

        return dto;
    }

}

Classe DTO para retorno personalizado

package br.com.alura.config.validacao;

public class ErroDeFormularioDto {

    private String campo;
    private String erro;

    public ErroDeFormularioDto(String campo, String erro) {
        this.campo = campo;
        this.erro = erro;
    }

    public String getCampo() {
        return campo;
    }

    public String getErro() {
        return erro;
    }

}
5 respostas

Oi Dyego,

Aparentemente o código está certinho.

Chegou a reiniciar o projeto para testar? Pode ser que o DevTools não tenha conseguido atualizar as mudanças no código automaticamente.

Rodrigo, sim. Cheguei a reiniciar o projeto mas sem sucesso para pegar apenas as informações essenciais (nome do campo e descrição do erro). Tentei fazer a inserção de dependências no POM e utilizar o Binding ao invés de methodArgument mas sem sucesso também (acredito que o binding seja válido só a partir da versão 2.3.0)

Consegue compartilhar seu projeto?

Pode ser pelo GitHub ou Google Drive/Dropbox

Segue link para baixar o .rar do projeto https://we.tl/t-Eoz6JQGlR2

solução!

Oi Dyego,

Acho que o problema é porque sua classe de configuracao, na verdade seu pacote, está fora do pacote forum, e com isso o Spring nem chegou a carregar sua classe.

Mova o pacote config para dentro do pacote forum que deve resolver.

Bons estudos!