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

Binding correto submissão de form com múltiplos objetos

Olá, como é possível fazer a partir de um formulário com vários campos, que o Spring faça o binding corretamente desses campos em dois objetos diferentes ? Sendo que um desses objetos compõe o outro.

Exemplo:

Possuo um formulário que envia para o controle campos de duas entidades distintas: Pessoa e Endereço. Sendo que Pessoa possui um atributo do tipo Endereço.

class Pessoa {

    private String nome;
    @OneToOne
    private Endereco endereco;
    // outros campos omitidos...
   // getters and setters
}

class Endereco {

    private String logradouro;

    // outros campos omitidos...
    // getters and setters
}

Logo, temos que definir quais campos são de qual objeto com precisão, senão tanto pode ocorrer do setter da classe que compõe (Endereco) não ser chamado para setar o valor de seu campo corretamente, ou ainda, se eu mudar o setEndereco da classe Pessoa pra receber a String que está vindo do formulário e setar o valor direitinho teria que deixar de receber um objeto e passar a receber parâmetros no controlador novamente.... algo que não desejo, pois esse modelo terá muitos campos.

Segue um exemplo de um controlador:

@RequestMapping(value = "/gravarPessoa")
    public String gravar(Pessoa pessoa, Endereco endereco) {

        pessoa.setEndereco(endereco);
        pessoaDAO.gravar(pessoa);

        return "pessoa/ok";
    }

Segue um exemplo de form:

<form action="/srm/gravarPF" method="POST">
                        <div class="form-group">
                            <label>Nome</label>
                            <input type="text" name="nome" class="form-control" placeholder='<fmt:message key="form.nome"/>'/>
                        </div>
                        <div class="form-group">
                            <label><fmt:message key="form.telefoneLabel"/></label>
                            <input type="text" name="telefone" class="form-control" placeholder="<fmt:message key="form.telefonePlaceholder"/>">
                        </div>
                        <div class="form-group">
                            <label>RG</label>
                            <input type="text" name="rg" class="form-control" placeholder="<fmt:message key="form.rg"/>">
                        </div>
                        <div class="form-group">
                            <label>Logradouro</label>
                            <input type="text" name="endereco" class="form-control" placeholder="<fmt:message key="form.logradouro"/>">
                        </div>
</form>

Alguém pode me dizer uma boa maneira de realizar isso ?

2 respostas
solução!

Fala aí Davi, tudo bem ?

Acho que você fazer o seguinte, imaginando que sua classe Endereco tenha apenas o atributo logradouro, nisso você fazer o seguinte :

<div class="form-group">
     <label>Logradouro</label>
    <input type="text" name="endereco.logradouro" class="form-control" placeholder="<fmt:message key="form.logradouro"/>">
</div>

E no seu controller você deve receber apenas a Pessoa, que você disse possui um endereço.

Faz o teste e fala para gente se deu tudo certo.

Abraços

Matheus, você está correto, e resolveu o meu problema perfeitamente.

Eu estava me enrolando todo pois antes usando herança com JPA e tentando salvar dois objetos em duas tabelas diferentes e realizando o relacionamento entre as entidades..

Tive toda sorte de problemas, depois que refatorei e simplifiquei o código para o que está aí postado, utilizando a sua resposta consegui tranquilamente receber apenas uma Pessoa no controlador e salvar a entidade com o relacionamento sendo feito automaticamente pela JPA com a classe Endereço.

Muito obrigado.