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 ?