Problema em passar valores para controller, VRaptor 3.1.2

7 respostas
S
Amigos estou enfrentando um problema no momento de passar os objetos javascript para o controller, criando o Objeto alerta de forma fixa com forme abaixo
var alerta={         
            "alertaTO.veiculos[0].id":1,
            "alertaTO.veiculos[0].placa":"abc2367",
            "alertaTO.veiculos[1].id":2,
            "alertaTO.veiculos[1].placa":"abc555",
            "alertaTO.emails[0]":"[email removido]",
            "alertaTO.emails[1]":"[email removido]",
            "alertaTO.alerta.id":1
        };
O objeto é passado com sucesso para o controller, agora se for feito de forma dinâmica da como abaixo o mesmo chega com seus atributos nulos, segue os códigos usados no momento da criação dinâmica do objeto, o controller recebendo este objeto, e a classe do objeto todos abaixo. JQuery
var alerta= new Object();
        alerta.alertaTO=new Object();        
        alerta.alertaTO.alerta=new Object();
        alerta.alertaTO.alerta.id=$('#alertaId').val();  
        alerta.alertaTO.alerta.descricao= ""+$('#alertasCriadosDescricaoId').val()+"";      
        alerta.alertaTO.veiculos=new Array();    
        jQuery.each($('#tbAdicionados tr'),function (i,val){            
            if(i>0){                
                alerta.alertaTO.veiculos[i-1]=new Object(); 
                //alert($(val).find("td:first #idAdicionado").val());
                alerta.alertaTO.veiculos[i-1].id=$(val).find("td:first #idAdicionado").val();
                alert("Veiculo["+i+"] id:"+alerta.alertaTO.veiculos[i-1].id);
                //alert($(val).find('td:first #placa').val());
                alerta.alertaTO.veiculos[i-1].placa=$(val).find("td:first #placa").val();
                alert("Veiculo["+i+"] placa:"+alerta.alertaTO.veiculos[i-1].placa);
                //alert($(val).find('td:first #horimetro').val());
                alerta.alertaTO.veiculos[i-1].horimetro=$(val).find("td:first #horimetro").val();            
                alert("Veiculo["+i+"] horimetro:"+alerta.alertaTO.veiculos[i-1].horimetro);                
                //alert($(val).find('#idHA').val());
                alerta.alertaTO.veiculos[i-1].horimetroPassado=$(val).find("#idHA").val();  
                alert("Veiculo["+i+"] horimetroPassado:"+alerta.alertaTO.veiculos[i-1].horimetroPassado)
            }
        });                      		
        var url = '<c:url value="/alerta.salvarAlerta"/>';         
        $.post(url,alerta,function(data){  
            //$.post(url, function(data) {
            //console.log(data);
            //id = data.long;

        })
        .success(function() { 
            //console.log(data);
            //$('#cliente').append("<option value='"+id+"'selected>" + nome + "</option>");
	
	    	  
        })
        .error(function() { 
            //console.log(data);
            //alert("error"); 

        })
        .complete(function() { 
            //console.log(data);
            //alert("complete"); 
        });
Controler
@Transactional
    @Post
    @PermissaoAcesso(permissao = Permissao.ALERTA_CRIADO_SALVAR)
    @Path("/alerta.salvarAlerta")    
    public void salvarAlerta(AlertaTO alertaTO) {
    	System.out.println(alertaTO);}
AlertaTO
public class AlertaTO {

    private List<Veiculo> veiculos;
    private List<String> emails;
    private AlertasCriados alerta;

    public AlertasCriados getAlerta() {
        return alerta;
    }

    public void setAlerta(AlertasCriados alerta) {
        this.alerta = alerta;
    }

    public List<String> getEmails() {
        return emails;
    }

    public void setEmails(List<String> emails) {
        this.emails = emails;
    }

    public List<Veiculo> getVeiculos() {
        return veiculos;
    }

    public void setVeiculos(List<Veiculo> veiculos) {
        this.veiculos = veiculos;
    }
}

Uma outra solução que eu gostaria de saber é como passar vários parâmetros para o controller via jquery.

public void salvarAlerta(AlertasCriados alertaCriado,List<Veiculo> veiculoAdcionados, List<String> emails) {}

7 Respostas

Lucas_Cavalcanti

o problema é que isso:

var alerta={           
            "alertaTO.veiculos[0].id":1
}

é diferente disso:

var alerta={           
            alertaTO: { veiculos: [{id:1}]}
}

que é o que vc tá gerando dinamicamente…

dá uma olhada no firebug (instale isso no firefox ou no chrome), e veja nele qual é a requisição que está sendo feita, e quais são os parâmetros passados.

dica: use console.log() ao invés de alert()

para passar vários parâmetros, é só passar com os nomes corretos. Nesse caso:

alertaCriado.propriedade=valor
veiculoAdcionados[0].propriedade=valor
emails[0].propriedade=valor
S

Lucas valeu pela ajuda, fiz da seguinte forma mudei a chamada do controller para esta que está abaixo, assim realizando um teste, e o javascript coloquei como abaixo, mas ao chegar no controller o objeto alertaCriado está nulo.

Controller

@Transactional @Post @PermissaoAcesso(permissao = Permissao.ALERTA_CRIADO_SALVAR) @Path("/alerta.salvarAlerta") public void salvarAlerta(AlertasCriados alertaCriado) { System.out.println(alertaCriado); }

JavaScript

var alertaCriado=new Object(); alertaCriado.id=2; var url = '<c:url value="/alerta.salvarAlerta"/>'; $.post(url,alertaCriado,function(data){ //$.post(url, function(data) { //console.log(data); //id = data.long; }) .success(function() { //console.log(data); //$('#cliente').append("<option value='"+id+"'selected>" + nome + "</option>"); }) .error(function() { //console.log(data); //alert("error"); }) .complete(function() { //console.log(data); //alert("complete"); });

Lucas_Cavalcanti

o certo seria:

var alertaCriado= {"alertaCriado.id": 2};
S

Puts to com problema em entender isso, pois ai eu volto no problema anterior de carregar o objeto na criação dele.

Se eu apenas consigo carregar informações no objeto pelo {} como vou fazer isso dinamicamente, por exemplo tenho que carregar um List com todos os meus veiculos dentro do javascript, sei que se eu fizer assim dá certo

veiculos={
"veiculo[0].id":1,
"veiculo[0].placa":"adb1234",
"veiculo[1].id":2,
"veiculo[1].placa":"abc3245"
}

Agora tenho que montar ele dinamicamente montando meu objeto dentro de um for onde vou pegar meus veiculos e colocando dentro do objeto para passa-los.

algo assim:

var veiculos=new Array();    
        jQuery.each($('#tbAdicionados tr'),function (i,val){            
            veiculos[i]=new Object(); 
            veiculos[i].id=$(val).find("td:first #idAdicionado").val();
            veiculos[i].placa=$(val).find("td:first #placa").val();
        });

Desculpa a encheção de saco mas é que não to conseguindo ver como posso fazer o dinâmico ficar igual ao fixo.

Lucas_Cavalcanti

dica, não precisa usar new Array() e new Object(), pode fazer [] ou {}:

var veiculos={};      
jQuery.each($('#tbAdicionados tr'),function (i,val){              
     veiculos['veiculos[' + i + '].id']=$(val).find("td:first #idAdicionado").val();  
     veiculos['veiculos[' + i + '].placa']=$(val).find("td:first #placa").val();  
});
donny

Lucas obrigado pelas dicas! Então se eu fizer de forma fixa, como está abaixo funciona, como a imagem "certo.png":

var alerta={         
            "alertaTO.veiculos[0].id":1,
            "alertaTO.veiculos[0].placa":"abc2367",
            "alertaTO.veiculos[1].id":2,
            "alertaTO.veiculos[1].placa":"abc555",
            "alertaTO.emails[0]":"[email removido]",
            "alertaTO.emails[1]":"[email removido]",
            "alertaTO.alerta.id":1
        };

Porém qdo os objetos são criados de forma dinâmicas eles ficam uma estrutura diferentes, como a imagem "errado.png" em anexo, e no Controller o objeto chega com os seus atributos "null". Segue abaixo como eu faço dinamicamente:

var veiculos={};      
        jQuery.each($('#tbAdicionados tr'),function (i,val){  
        	if(i&gt;0){            
             	veiculos['veiculos[' + i + '].id']=Number($(val).find("td:first #idAdicionado").val());  
             	veiculos['veiculos[' + i + '].placa']=$(val).find("td:first #placa").val(); 
        	} 
        }); 

var emails={};
		emails.emails = "[email removido]";
		emails.emails = "[email removido]";
		
        
var alertaTO={};        
            alertaTO.veiculos=veiculos;
            alertaTO.emails=emails;

var alerta = {};
            alerta.alertaTO = alertaTO;   
	
        var url = '&lt;c:url value="/alerta.salvarAlerta"/&gt;'; 
           console.log(alerta);
$.post(url,alerta,function(data){ }

Seguem em anexo as imagens do Firebug.






donny

Até que fim consegui fazer funcionar!!! Rs! Segue abaixo o código de exemplo:

var alerta={};  

        alerta['alertaTO.alerta.id']= 1;
            
        jQuery.each($('#tbAdicionados tr'),function (i,val){  
        	if(i&gt;0){            
        		alerta['alertaTO.veiculos[' + i + '].id']=Number($(val).find("td:first #idAdicionado").val());  
        		alerta['alertaTO.veiculos[' + i + '].placa']=$(val).find("td:first #placa").val(); 
        	} 
        }); 


        alerta['alertaTO.emails[0]']='[email removido]';
        alerta['alertaTO.emails[1]']='[email removido]';

     	
        var url = '&lt;c:url value="/alerta.salvarAlerta"/&gt;'; 
        console.log(alerta);
        $.post(url,alerta,function(data){  }
Criado 28 de janeiro de 2012
Ultima resposta 29 de jan. de 2012
Respostas 7
Participantes 3