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

Essa validação só funcionaria para o Form?

Olá.

Essa validação funciona perfeitamente para a criação de tópicos. Mas, por exemplo, como criar o método de validação no ErrorHandler para outras coisas, como a validação das respostas? Escrever outro método?

6 respostas

Oi Leonardo,

Nesse caso o ideal seria ter outro método no controller, que seria responsável por receber as requisições para cadastrar respostas em um tópico, sendo que nesse método você receberia um outro DTO com as validações específicas dele.

Desse jeito os cadastros de tópicos e de respostas ficam separados, cada um contendo suas validações específicas.

Bons estudos!

Oi Rodrigo,

Obrigado pela resposta. A minha dúvida é o que fazer com o método handle(), do ValidationErrorHandler. Ele espera um tipo especifico de form, que vai montar as respostas baseados nos campos que contém na criação do tópico. Mas e para a criação da resposta?

É isso que não entendi muito bem. O método handle deve sofrer sobrecarga para cada coisa que queremos validar?

Oi Leonardo,

Na verdade o @RestControllerAdvice que criamos no curso(classe ValidacaoHandler), funciona de maneira genérica.

Não importa qual controller ou DTO que está sendo utilizado, o papel dessa classe é pegar todos os erros de validação que foram registrados pelo Bean Validation e simplificar as mensagens de erro.

Se você reparar no método handle, verá que ele recebe como argumento um objeto do tipo MethodArgumentNotValidException, que representa uma exceção lançada pelo Spring ao chamar algum método de algum controller que contem parâmetros inválidos.

Dessa forma não vai haver a necessidade de fazer sobrecarga desse método, pois ele não está validando apenas tópicos, mas qualquer objeto que contenha erros de validação do bean validation.

Entendi. E como eu posso especificar os campos para cada validação?

Por exemplo, FormErrorDto retornaria os possíveis campos de erro "mensagem", "titulo" etc, por se tratar dos tópicos.

Mas se eu tenho uma validação para, por exemplo, um Login, ele deveria retornar os campos "login" e "senha".

Existe alguma forma de pegar os campos dinamicamente, baseado em qualquer validação?

solução!

As mensagens serão de acordo com o nome dos campos , que estão representados pelos atributos da classe DTO.

Por exemplo, para validar o cadastro de uma Resposta, você provavelmente criaria uma classe NovaRespostaForm, similar ao que fizemos no cadastro de tópico:

public class NovaRespostaForm {

    private String resposta;
    private Long idTopico;

    // setters
    public void setIdTopico(Long idTopico) {
        this.idTopico = idTopico;
    }

    public void setResposta(String resposta) {
        this.resposta = resposta;
    }

}

E agora basta adicionar as anotações de validação do Bean Validation, de acordo com as validações que você quiser realizar. Por exemplo:

public class NovaRespostaForm {

    @NotNull
    @NotEmpty
    private String resposta;

    @NotNull
    private Long idTopico;

    //resto do codigo da classe...
}

E não precisaria mexer em nada na classe ValidacaoHandler.

Desse jeito se um cliente enviar uma requisição para cadastrar uma resposta, mas enviar o campo resposta vazio, seria devolvido para ele o seguinte json com os erros de validação:

[
    {
        "campo": "resposta",
        "mensagem": "Não pode estar vazio"
    }
]

Repare no json que o campo se chama resposta, pois esse é o nome do atributo na classe NovaRespostaForm.

Desse jeito cada classe dto tera seus campos com nomes distintos e as mensagens de validação vão puxar esses nomes automaticamente.

Entendi! Muito obrigado!

O curso é excelente!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software