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

Persistir Valor selecionado em um Combobox

Pessoal, criei uma entidade usuário que possui um relacionamento OneToOne com a entidade setor:

    @OneToOne (cascade=CascadeType.PERSIST)
    @JoinColumn(name="setor_id", nullable=true)
    private Setor setor;

e na minha página jsp eu listo os setores em um combobox:

<div class="campo"> 
<form:label path="setor">Setor</form:label><br> 
<form:select path="setor" required="true" > 
<form:option value=""> Setor</form:option> 
<c:forEach var="setor" items="${setores}"> 

<form:option value="${setor.id}">${setor.nome}</form:option> 
</c:forEach> 
</form:select> 
</div> 

porém quando clico em salvar nada ele entra no if de erro do metodo save no controller:

@RequestMapping(value = "/save", method = RequestMethod.POST)
    public String save(@RequestParam Long id, @ModelAttribute("usuario") @Validated Usuario usuario,
                       BindingResult result) {


        lista();
        if (result.hasErrors()) {
        System.out.println("-------entrou no erro---------------");    
            return "usuario/cadastro";
        }

        Avatar avatar = avatarService.getAvatarByUpload(usuario.getFile());
        Setor setor = setorService.findById(id);
        usuario.setAvatar(avatar);
        usuario.setSetor(setor);


        usuarioService.save(usuario);

        return "redirect:/auth/form";
    }

Acredito que seja porque o Setor faz parte do objeto usuário e o que está sendo passado pela página seja o id do setor.

Se puderem ajudar agradeço muito.

3 respostas

Qual erro que tá dando?

Boa noite André! Não é mostrado nenhum erro no console. Entra no if (result.hasErrors()) e retorna para a página de cadastro.

solução!

Ok, a página retorna um id da opção selecionada no combobox e como o Setor faz parte do objeto usuário erá aguardado receber o objeto Setor e não o id. Então,foi preciso criar uma classe de conversão, estendendo da classe PropertyEditorSupport , que vai receber o id e por meio de uma consulta no banco por esse id, vai retornar um objeto Setor para o Usuario. Ficou assim:

public class SetorEditorSupport extends PropertyEditorSupport{

    private SetorRepository repository;

    public SetorEditorSupport(SetorRepository repository) {
        this.repository = repository;
    }


    @Override
    public void setAsText(String text) throws IllegalArgumentException{

        Long id = new Long(text);

        Setor setor = repository.findOne(id);

        super.setValue(setor);
    }