Spring MVC Data Binding

Olá Pessoal tudo ok ?

Bom estou com um problema em um projeto, estou utilizando Spring + Spring MVC + JPA …

Tenho o seguinte contexto:

class classA {
private String xx;
}

class classB {
private string ccc;
private classA aa;
}

Bom, pelo controller do spring MVC eu passo o objeto classB e uma lista de classA para o form e monto uma combo utilizando a lista de classA com tagLig do Spring,
quando meu controlador vai me devolver o objeto classB montado ele da erro, por que no lugar do objeto classA ele recebe o código do objeto selecionado.

Minha questão é, qual a solução para esse caso utilizando o Spring MVC ? Alguém tem algum exemplo ?

Posta seu código(JSP), para que eu possa te ajudar e entender melhor.

Algo assim … (não estou com os fontes aqui …)

<form:select path=“classbobj.aa”>
<form:options items="${listclassA}" itemLabel=“name” itemValue=“id” />
</form:select>

Obs2: “classbobj” é o obj passado do controller para o formulário ModelMap m.addAttribute(“classbobj”, new classB());
Obs1: “listclassA” é uma lista de objetos que foi passada do controller pelo ModelMap m.addAttribute(“listclassA”, daoClassA.getList());

Obrigado desde já.

Cara você usa hibernate ? Não estou conseguindo entender direito o que você quer,mas se eu entendi, o correto é você passar assim

<form:select path=“classobj.aa.codigodoobjeto”>

onde o código do objeto seja o id(pk) dele, até pq o combo não te retorna um objeto ele só te retorna um código e através desse código você acessa o objeto.

[quote=MGSAHAO]Cara você usa hibernate ? Não estou conseguindo entender direito o que você quer,mas se eu entendi, o correto é você passar assim

<form:select path=“classobj.aa.codigodoobjeto”>

onde o código do objeto seja o id(pk) dele, até pq o combo não te retorna um objeto ele só te retorna um código e através desse código você acessa o objeto.[/quote]

Então, eu to usando JPA …

Assim, o que ta rolando é o seguinte …
Quando eu submeto o form, o spring ta pegando o o código do objeto que foi selecionado na “combo” e tentando colocar no classB.aa … Só que o classA.aa espera um objeto do tipo classA … Ai o spring da uma exception de type missmatch.

Eu vi uma forma de resolver isso com um “org.springframework.format” você conhece algo ?

Só que cara, você tem um relacionamento entre os dois objetos, que seria uma fk certo ? Quando você for salvar o ClassB ele ele precisa apenas dessa fk da classe A, por isso você tem que por do jeito que eu te falei no path do select.

Eu entendi o que você ta dizendo …

Que eu tenho que passar para o meu controller o código da fk, para receber no controller o código e buscar o objeto pelo código e setar no objeto que é composto por essa classe …

O que eu gostaria de saber é se o spring não consegue receber esse valor interiro (fk) e fazer a busca e já injetar o obj … Da uma olhadinha nesse tuto … É exatamente meu contexto …

Link: http://ankeetmaini.wordpress.com/2012/08/01/binding-nested-objects-complex-properties-with-springs-formselect-tag/

Entretanto não consegui fazer funcionar …

Cara… sinceramente não sei qual a lógica de você querer isso, posta seu model ai para eu ver, você deve ter um joinColum no campo que faz referencia a outra classe, você deve ter mapeado pela fk, quando você submeter esse form o objeto ClasseA ja vai ter o objeto classeB, você não precisa buscar o objeto ja esta “carregado”. Quando você der um classB.getClassA() você vai ter o objeto.

O contexto que estou trabalhando é para salvar o objeto com sua dependencia (classA) … Assim que chegar em casa posto como está feito …

Segue o código …

Controller

@RequestMapping(value="/Cidade/form", method= RequestMethod.GET)
    public String getForm(ModelMap m){
        Cidade c = new Cidade();
        m.addAttribute("cidade", c);
        
        List<Estado> estados = eDao.findAll();
        m.addAttribute("estados", estados);
        
        return"Cidade/form";
    }

    @RequestMapping(value="/Cidade/set", method= RequestMethod.POST)
    @ResponseBody
    public String setCidade(@ModelAttribute("cidade") Cidade c){
            cDao.save(c);
        return "";
    }

form

<form action="set" modelAttribute="cidade" method="POST">
            <fieldset>
                <label>
                    <input type="text" name="idCidade" />
                </label>
                
                <label>
                    <input type="text" name="nomeCidade"/>
                </label>
                
                <label>
                    <form:select path="cidade.estado">
                        <form:option value="-1" label="Selecione" />
                        <form:options items="${estados}" itemLabel="nomeEstado" itemValue="idEstado"  />
                    </form:select>                    
                </label>
                
                <label>
                    <input type="submit" value="Enviar" />
                </label>
                
                <label>
                    <input type="reset" value="Limpar" />
                </label>
            </fieldset>

Modelo: Estado

@Entity
@Table(name = "CAD_ESTADO")
public class Estado implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private Long idEstado;
    
    @Column(name = "NOME_ESTADO", length = 45)
    private String nomeEstado;
    
    @Column(name = "SIGLA", length = 2)
    private String sigla;
}

Modelo: Cidade

@Entity
@Table(name = "CAD_CIDADE")
public class Cidade implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private Long idCidade;
    @Column(name = "NOME_CIDADE", length = 45)
    private String nomeCidade;
    @ManyToOne
    private Estado estado;
}
  <label>  
                    <form:select path="cidade.estado.estadoId">  
                        <form:option value="-1" label="Selecione" />  
                        <form:options items="${estados}" itemLabel="nomeEstado" itemValue="idEstado"  />  
                    </form:select>                      
                </label>

tenta fazer assim, e salvar , se der erro, antes de salvar da um c.getEstado() e verifica se o objeto Estado esta nulo.

[code]@Entity
@Table(name = “cidade”)
@SequenceGenerator(name = “cid_seq”, sequenceName = “cid_seq”)
public class Cidade implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@Column(name = "cid_id")
@GeneratedValue(generator = "cid_seq")
private long cidId;

@NotNull
@Column(name = "cid_nome")
private String cidNome;

@ManyToOne
@JoinColumn(name = "est_id", referencedColumnName = "est_id")
private Estado estado; [/code]

da uma olhada nesse meu model, eu declaro o campo , não sei se isso é feito automaticamente pela pk…

Eu tinha postado outra coisa aqui … Mais era uma “,” no lugar do “.” no servletDispatcher.xml …

Está funcionando corretamente … Muito obrigado pela ajuda !