1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Passagem de objeto que tem como atributo uma lista de objetos com @ModelAttribute em SpringMVC.

Estou tentando passar um objeto que tem uma lista de objetos do lado cliente(com ExtJS) para o lado servidor. O SpringMVC me permite usar o @ModelAttribute porém o mesmo não está funcionando para o preenchimento da lista de objetos.

Objeto:

public class Rota{

    private Long id;

    private String descricao;

    private List<Estacao> estacoes;

    (...)

}

Controlador que recebe a requisição:

    @RequestMapping(value = "/rota/save", method = RequestMethod.POST)
    public @ResponseBody HashMap save(@ModelAttribute("action") Rota rota) {

    HashMap result = new HashMap();

    try {
        rotaService.save(rota);
        result.put("success", true);
        result.put("msg", "Salvo com sucesso!");
    } catch (Exception e) {
        result.put("success", false);
        result.put("msg", e.getMessage());
    }


    return result;
    }

Enquanto debugo do lado do ExtJS, consigo ver que o conteúdo da lista(Array) está preenchido:

form._record.data: Object
    descricao: "Rota dos Produtos Intermediários"
    estacoes: Array[3]
            0: Object
               descricao: "Integração"
               id: 3
               tipo: "Integração"
               __proto__: Object
            1: Object
               descricao: "Teste"
               id: 4
               tipo: "Teste"
               __proto__: Object
            2: Object
               descricao: "Estação"
               id: 7
               tipo: "Embalagem"
               __proto__: Object
            length: 3
    __proto__: Array[0]
    id: 1

Porém, ao fazer a requisição, do lado Spring o conteúdo que chega é:

rota= Rota(id=127)
    descricao= "Rota dos Produtos Intermediários"
    estacoes= null
    id= 1

Requisição:

    salvarRota : function(button) {

        var win = button.up('window');

        var form = win.down('form').getForm();

        var grid = win.down('#rota').getStore();

        var gridFundo = this.getRotaGrid();

        var estacoes = new Array();

        var dadosGrid = grid.data.items;

        Ext.each(dadosGrid, function(node) {
            var estacao = new Object();
            estacao = node.raw;
            estacoes.push(estacao);
        });

        form._record.data.estacoes = estacoes;

        var myMask = new Ext.LoadMask(Ext.getBody(), {
            msg : 'Por favor aguarde...'
        });
        myMask.show();

        form.submit({
            url : 'rota/save.form',
            waitMsg : 'Carregando...',

            success : function(form, action) {
                myMask.destroy();
                var obj = Ext.decode(form.responseText);
                Ext.MessageBox.show({
                    title : Constants.titulo,
                    msg : obj.msg,
                    icon : Ext.Msg.INFO,
                    buttons : Ext.Msg.OK,
                    fn : function(rec) {
                        gridFundo.getStore().reload();
                        button.up('window').close();
                    }
                });
            },
            failure : function(form, action) {
                myMask.destroy();
                var msg = Ext.decode(form.responseText);
                Ext.MessageBox.show({
                    title : Constants.titulo,
                    msg : msg,
                    icon : Ext.Msg.WARNING,
                    buttons : Ext.Msg.OK,
                    fn : function(rec) {
                        button.up('window').close();
                    }
                });
            }
        });
    },

Alguem já passou por isso e pode me ajudar? Desde já, agradeço.

  • Pq você retorna um HashMap? Vou postar um exemplo do que faço.

    mariogpr   19 de dez de 2014
  • Alias, antes de mandar pro "lado Spring" use o stringify nele, use o comando var obj = JSON.stringify(seuObjeto); ai mande o obj pra sua Controller... Só demonstre como você faz o post Ajax dele.

    mariogpr   19 de dez de 2014
  • Na verdade o HashMap de retorno é só para a requisição ser tratada de volta no lado cliente. O problema está sendo logo na chamada do método, o atributo "List" do objeto passado por parâmetro "Rota" não está sendo preenchido.

    FernandoL   19 de dez de 2014
  • Fiz uma edição no post mostrando a requisição. Na verdade, através do form.submit() eu consigo fazer a requisição pro "lado Spring".

    FernandoL   19 de dez de 2014
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags extjs javascript spring-mvc java ou faça a sua própria pergunta.