3
respostas

Validação com campos dinâmicos

Bom dia pessoal,

no exemplo apresentado temos como validação campos da descrição, título e páginas. Tenho uma pergunta, quero adicionar uma regra, dizendo que o preco do combo não pode ser maior do que o preço do impresso, penso que ficaria assim:

        if(precos.getTipo().COMBO < precos.getTipo().IMPRESSO){

        }

Porém quando recebi um object na entrada do parâmetro com target fiz o cast para Produto, como eu devo fazer para utilizar o mesmo target duas vezes sem criar outra classe validation? Isso é possível?

3 respostas

Não sei se entendi direito, mas basta vc usar a mesma referência que vc fez o cast. Use o mesmo produto, já que ele possui os preços.. Vc não perguntou,mas eu vou falar do mesmo jeito. Essa validação aí, acho que deveria ficar dentro da classe produto e o método retornaria um boolean, que vc chamaria no validator.

Alberto, sei que tu tem bastante experiência mas eu não vou concordar contigo até tu me dar um motivo para usar o meu if dentro da classe Produto. No momento, tenho ela dentro de ProdutoValidation, talvez o mais correto seria criar um preco Validation. Vou colar aqui pra tentar ser mais esqpecífico:

    public void validate(Object target, Errors erros) {
        ValidationUtils.rejectIfEmpty(erros, "titulo", "field.required");
        ValidationUtils.rejectIfEmpty(erros, "descricao", "field.required");

        Produto produto = (Produto) target;
        if(produto.getPaginas() <= 0){
            erros.rejectValue("paginas", "field.required");
        }

// demais códigos omitidos

ali como parametro recebemos um target correto? Porém e se eu quisesse utilizar o preco justamente para fazer esse if abaixo:

// demais códigos omitidos
       if(precos.getTipo().COMBO < precos.getTipo().IMPRESSO){
        erros.rejectValue("impresso", "field.required");
        }
// demais códigos omitidos

Eu imagino que não seja possível fazer o cast de um parametro duas vezes a depender da classe "chamadora". A melhor solução é criar um PrecoValidation ou existe sim uma possibilidade de fazer aí?

Abraços amigo.

Fico é feliz que vc discorde :). Se entendi direito, precos é recuperável a partir do produto... Então vc precisa consultar informações que estão apenas dentro do produto, acessível através do atributo preços. Se vc já tem o atributo dentro do objeto, a melhor prática é criar um método lá dentro e usar.. Caso contrário seu objeto fica anêmic => https://martinfowler.com/bliki/AnemicDomainModel.html

É como eu disse, o preco faz parte do produto, vc não precisa de 2 casts. Agora, caso não faça, vc precisa criar uma classe que tenha um atributo produto e outro chamado precos e, aí sim, seu código pode ser a solução.

De todo jeito, fica a vontade para discordar, é saudável.