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

Sobre as validações da Aula 06

Bom Dia,

Estou com algumas dúvidas sobre a classe ProdutoValidation e seus métodos, consultei o javadoc mas não entendi muito. O seguinte método:

ValidationUtils.rejectIfEmpty(errors, "titulo", "field.required");

É um método estático que rejeita o valor passado no campo "titulo" se ele estiver vazio? Isso né? OK, mas e o campo "field.required", li que é um código de erro coisa do tipo, oque significa esse campo na verdade? e pra que ele serve?

E esse método:

errors.rejectValue("paginas", "field.required");

pq precisa do "field.required"? e pq usamos o objeto errors? Não podemos usar o ValidationUtils?

E o método gravar:

public ModelAndView gravar(@Valid Produto p, BindingResult result, RedirectAttributes redirectAttributes){

        if(result.hasErrors()){
            //return form();
            return new ModelAndView("produtos/form");
        }
 //restante do código
}

De onde "vem" esse BindingResult? Está meio confuso essa parte, essa aula ficou meio confusa ou eu achei difícil de entender, enfim se puder me ajudar ou passar algum link que explique melhor serei grato.

Valeus

4 respostas

Fala Tiago, tudo bem ?

Então. O objeto errors do método validate(..) é o registrador dos erros de validação e conversão do Spring. Em resumo, como a validação é aplicada automaticamente pelo Spring (quando você anota com @Valid) ele vai usar sua implementação de Validator, onde você vai registrando as ocorrências (rejeitando valores através do objeto errors).

Como a validação ocorre durante o processo de binding (quando seu objeto está sendo montado pelo Spring com os dados que vieram do formulário), você não teria meios de saber qual o resultado do processo. A menos que o Spring te desse acesso aos resultados, que é o que ele faz permitindo que você receba um objeto de BindingResult no método. Com ele você pode verificar se houve algum problema e prever uma volta para o formulário, por exemplo.

Sobre os métodos:

errors.rejectValue("paginas", "field.required");

Aqui temos a maneira padrão de indicar problemas de validação quanto a um campo. Dada um verificação sua, se algo deu errado com o valor passado no campo paginas, você rejeita o valor, registrando no objeto errors.

Vejamos o outro exemplo:

ValidationUtils.rejectIfEmpty(errors, "titulo", "field.required");

Aqui já temos uma classe de Utils (utilitária) apenas pra facilitar sua escrita. Como o próprio nome do método ja diz caso o valor do campo titulo esteja vazio seu valor será rejeitado, e um erro de validação será adicionado. Internamente ocorre o mesmo errors.rejectValue("titulo", "field.required"); citado anteriormente. Ou seja, a classe só te ajuda a não escrever tanto if pra String vazia, que é algo super comum.

Sobre o parâmetro "field.required", ele representa a chave usada pra registrar mensagens de erro relativas a ausência do valor. Poderia ser usado qualquer outra String como chave, mas "field.required" acaba sendo um padrão pra campos requeridos. Tanto que o próprio framework já é capaz de disponibilizar mensagens de erro padrão pra essa chave, quando utilizada.

Espeto ter ajudado no pensamento.

Abraço!

Cara, muito obrigado, me ajudou muito mesmo! Está de parabéns, só uma última coisa que esqueci de mencionar acima: O seguinte método, da minha classe ProdutoValidation que implementa Validator:

@Override
    public boolean supports(Class<?> clazz) {
        return Produto.class.isAssignableFrom(clazz);
    }

Esse método apenas verifica se o objeto que será validado no Binding é uma instancia de Produto ? Isso né?

solução!

Exatamente Tiago.

Como você pode ter diferentes validadores, o Spring vai usar esse método pra saber se pode aplicar este validador ao objeto anotado com @Valid. Se forem compatíveis ele aplica sua validação, senão ele a ignora. =)

Muito obrigado pela atenção e paciência cara, deu uma "clareada" aqui, vlw mesmo =D