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

Problema com Vraptor + Combobox + Bean Validator

Olá a todos, estou passando por um problema meio estranho ao utilizar um campo select. Na minha tela de cadastro de matérias o usuário precisa selecionar o tipo da matéria, sendo que o tipo da matéria é um campo obrigatório, então eu coloquei nele a anotação @NotNull, o problema acontece quando envio o formulário de cadastro de matéria sem selecionar nenhum tipo matéria, pois o form não envia null, ele está enviando um new TipoMateria(), ou seja ele não cai no bean validator e me dá um erro de org.hibernate.TransientPropertyValueException já que esse registro de tipo matéria não existe no banco de dados. Como contornar esse problema?

@Entity
@Table(name = "materia")
public class Materia  implements Serializable{

    @ManyToOne
    @JoinColumn(name = "tipo_materia_id")
    @NotNull
    private TipoMateria tipoMateria;
}
 <select name="materia.tipoMateria.tipoMateriaId"
                    id="tipos" class="form-control">

                    <option value=""></option>
                    <c:forEach items="${tipoMaterias}" var="tipo">
                        <option value="${tipo.tipoMateriaId}"
                            <c:if test="${materia.tipoMateria.tipoMateriaId == tipo.tipoMateriaId}">selected="selected"</c:if>>${tipo.nome}</option>
                    </c:forEach>
                </select>

@Controller
public class MateriasController {
@Post("/materias")
    public void salvarMateria(@Valid Materia materia){
    validator.onErrorForwardTo(this).editar(materia);

}

}
3 respostas
solução!

Oi Ricardo, tudo bem?

por default, quando o parâmetro não está no request o VRaptor instância um objeto vazio, pra evitar NPE. Se você quiser, pode sobrescrever esse comportamento conforme o exemplo desse link da documentação:

http://www.vraptor.org/en/docs/components/#instantiating-only-request-present-parameters

outra opção seria enviar um TipoMateria invalido como default, se nenhum outro for selecionado na view, de acordo com sua regra de negócio.

Faz sentido?

Obrigado Turini, faz sentido sim. Eu estava pensando também se um Converter resolveria o problema. oque você acha?

também poderia ser um Converter sim! (;

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