Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

dúvida class ValidationUtils e typeMismatch do message.properties

Olá pessoal, vou expor algumas duvidas que surgiu com a aula 6 e 7.

Eu queria entender melhor como o Spring trabalha com a classe ValidationUtils. para isso vou descrever o meu entendimento e posteriormente descrever minhas duvidas, caso eu tenha entendido errado, peço que me corrija.

No método rejectIfEmpty() da class ValidationUtils, é evidente que ele recebe os seguintes parâmetros (Errors errors, String field, String errorCode) e logo depois chama uma sobrecarga mandando + 2 parâmetros null: rejectIfEmpty(errors, field, errorCode, null, null), mas o que significa esses 2 últimos parâmetros, no metodo diz ser Object[] errorArgs, String defaultMessage, mas não entendi como utiliza-los e nem seu propósito. Abaixo deixo os respectivos métodos da class mencionada no texto.

class ValidationUtils:

    public static void rejectIfEmpty(Errors errors, String field, String errorCode) {
        rejectIfEmpty(errors, field, errorCode, null, null);
    }
    public static void rejectIfEmpty(
            Errors errors, String field, String errorCode, Object[] errorArgs, String defaultMessage) {

        Assert.notNull(errors, "Errors object must not be null");
        Object value = errors.getFieldValue(field);
        if (value == null || !StringUtils.hasLength(value.toString())) {
            errors.rejectValue(field, errorCode, errorArgs, defaultMessage);
        }
    }

Outra dúvida é sobre o parâmetro errorCode, ele pode receber qualquer String ? Ele funciona como uma chave para fazer o relacionamento com o arquivo message.properties ? Não entendi muito bem, pois o professor utilizou o field.required e eu utilizei campo.obrigatorio como errorCode, colocando no properties da seguinte forma: campo.obrigatorio.produto.titulo = O titulo é obrigatório. segue abaixo o código da minha implementação.

class ProdutoValidation

@Override
    public void validate(Object target, Errors errors) {
        ValidationUtils.rejectIfEmpty(errors, "titulo", "campo.obrigatorio");
        ValidationUtils.rejectIfEmpty(errors, "descricao", "campo.obrigatorio");
        Produto produto = (Produto) target;    
            if(produto.getPaginas() <= 0){
                errors.rejectValue("paginas", "campo.obrigatorio");
            }
    }

arquivo message.properties

campo.obrigatorio = Campo obrigatório
campo.obrigatorio.produto.titulo = O titulo é obrigatório
campo.obrigatorio.produto.paginas = O campo páginas é obrigatório
campo.obrigatorio.produto.descricao = O campo descrição é obrigatório
typeMismatch = o tipo do dado é inválido

E por fim, queria entender o typeMismatch, sei que ele indica que aconteceu um problema de conversão, mas como o Spring associou ele ao field paginas? Já que o professor informou no método validate que o field paginas era "field.required"; se é o Spring que identifica isso, teria alguma especificação para que eu possa dar uma olhada? estou curioso para saber se existe outros comandos como o typeMismatch. Posso estar falando besteira mas é porque eu realmente não entendi.

1 resposta
solução!

Pelo contrário, eu acho que vc entendeu. A sobrecarga recebe os argumentos da msg do properties, caso exista e uma mensagem default, caso a chave passada não exista no properties. O typeMismatch ali ficou como default para qualquer problema de conversão. Poderia ser typeMismatch.Integer, para problemas de conversão de inteiros.. aí vc pode ir especificando mais ainda.