Dúvida com DWR

Olá pessoal, estou com uma duvida de como realizar uma busca com DWR passando alguns valores como parametro.

Segue meu código para que possam me ajudar:

Minha código JavaScript/DWR que acessa o código Java:

[code]function obterCampos(){
var dataInicial = document.getElementById(‘form:dataInicial’).value;
var dataFinal = document.getElementById(‘form:dataFinal’).value;
var orgaoArrecadador = document.getElementById(‘form:orgaoArrecadador’).value;
var tipoEnvio = document.getElementById(‘form:tipoEnvio’).value;

alert("Data Inicial: "+ dataInicial +"\n\n" +
	  "Data Final: "+ dataFinal + "\n\n" +
	  "Orgão Arrecadador: "+ orgaoArrecadador + "\n\n" +
	  "Tipo de Movimento: "+ tipoEnvio);


var listaArquivoMonitoracao = RemessaRetornoAjax.buscar(dataInicial, dataFinal, orgaoArrecadador, tipoEnvio);

}[/code]

Meu código Java o qual é acessado pelo JavaScript/DWR:

[code]public void buscar(Date dataIncial, Date dataFinal, OrgaoArrecadador orgaoArrecadador, TipoEnvio tipoEnvio) throws Exception {
boolean ehBuscaValida = true;

	if (!ehPeriodoRecepcaoValido(dataInicial, dataFinal)) {
		ehBuscaValida = false;
	}

	if(ehBuscaValida){
	
	data = dataFinal;
	data = DataUtil.adicionaSegundos(dataFinal, 86399);

	setListaArquivoMonitoracao(obterListaArquivoMonitoracao(dataInicial, data, orgaoArrecadador,
			tipoEnvio));
	}
	
}[/code]

E o resultado disso tudo que não consigo entrar dentro do método buscar.

Seu método buscar na classe em Java deve receber tipo primitivos ou classes wrappers…

Afinal sua variável em JS orgaoArrecadador não é uma classe java, concorda?

Experimente colocar todos os parâmetros como String e veja se funciona…

[quote]Seu método buscar na classe em Java deve receber tipo primitivos ou classes wrappers…

Afinal sua variável em JS orgaoArrecadador não é uma classe java, concorda?

Experimente colocar todos os parâmetros como String e veja se funciona…[/quote]

Realmente, vou dar uma olhada nisso. Obrigado ignacio83.

Olá Anderson.

Primeiro vamos algumas dicas.

No lugar de usar:

var dataInicial = document.getElementById('form:dataInicial').value;  

Use:

var dataInicial = dwr.util.getValue("dataInicial");

Ou

var dataInicial = dwr.util.byId("dataInicial").value;

ou ainda

var dataInicial = $("dataInicial").value;

Você poderá utilizar também:

var formulario = dwr.util.getValues("formID");

Assim ela pega TODOS os campos do formulario e gera algo do tipo:

var formulario = {
                    dataInicial:valor,
                    dataFinal:valor,
                    orgaoArrecadador:valor
}

Então caso você tenha um objeto que possua exatamente essas propriedades basta passar na chamada.

RemessaRetornoAjax.buscar(formulario, {callback});

Classe java:

public void buscar(ObjetoX objeto)....

Agora vamos ao seu problema.

var listaArquivoMonitoracao = RemessaRetornoAjax.buscar(dataInicial, dataFinal, orgaoArrecadador, tipoEnvio);

Isso está errado… vejamos como deveria ser…


function obterCampos(){  
    var dataInicial = document.getElementById('form:dataInicial').value;  
    var dataFinal = document.getElementById('form:dataFinal').value;  
    var orgaoArrecadador =  document.getElementById('form:orgaoArrecadador').value;  
    var tipoEnvio = document.getElementById('form:tipoEnvio').value;  
      
        
    RemessaRetornoAjax.buscar(dataInicial, dataFinal, orgaoArrecadador, tipoEnvio, {
                   callback:function(retorno){
                         //trate o resultado aqui."retorno" é o retorno do seu método buscar no java.
                    }
               });  
          

}  

Outra coisa, seu método java não esta retornando NADA. Caso você realmente não queria retornar nada, basa passar o callback vazio ou simplesmente não passar ele.

Abraços

Mais uma coisa, aconselho dar uma lida nos artigos sobre DWR.

www.handersonfrota.com.br/artigos-tutoriais/ e na revista Java Magazine 66.

Abraços e qualquer dúvida posta ai.

[quote=ignacio83]Seu método buscar na classe em Java deve receber tipo primitivos ou classes wrappers…

Afinal sua variável em JS orgaoArrecadador não é uma classe java, concorda?

Experimente colocar todos os parâmetros como String e veja se funciona…[/quote]

Com o DWR não tem essa necessidade, ele faz o convert para o bjeto java desejado. Se for Date ele converte, se for int ou Integer ele também faz a conversão.

Claro que no final, tudo que você passar será string, mas o DWR irá quando chegar no servidor fazer o convert para o tipo de objeto que o método espera.

Abraços

[quote=handersonbf]Olá Anderson.

Primeiro vamos algumas dicas.

No lugar de usar:

var dataInicial = document.getElementById('form:dataInicial').value;  

Use:

var dataInicial = dwr.util.getValue("dataInicial");

Ou

var dataInicial = dwr.util.byId("dataInicial").value;

ou ainda

var dataInicial = $("dataInicial").value;

Você poderá utilizar também:

var formulario = dwr.util.getValues("formID");

Assim ela pega TODOS os campos do formulario e gera algo do tipo:

var formulario = {
                    dataInicial:valor,
                    dataFinal:valor,
                    orgaoArrecadador:valor
}

Então caso você tenha um objeto que possua exatamente essas propriedades basta passar na chamada.

RemessaRetornoAjax.buscar(formulario, {callback});

Classe java:

public void buscar(ObjetoX objeto)....

Agora vamos ao seu problema.

var listaArquivoMonitoracao = RemessaRetornoAjax.buscar(dataInicial, dataFinal, orgaoArrecadador, tipoEnvio);

Isso está errado… vejamos como deveria ser…


function obterCampos(){  
    var dataInicial = document.getElementById('form:dataInicial').value;  
    var dataFinal = document.getElementById('form:dataFinal').value;  
    var orgaoArrecadador =  document.getElementById('form:orgaoArrecadador').value;  
    var tipoEnvio = document.getElementById('form:tipoEnvio').value;  
      
        
    RemessaRetornoAjax.buscar(dataInicial, dataFinal, orgaoArrecadador, tipoEnvio, {
                   callback:function(retorno){
                         //trate o resultado aqui."retorno" é o retorno do seu método buscar no java.
                    }
               });  
          

}  

Outra coisa, seu método java não esta retornando NADA. Caso você realmente não queria retornar nada, basa passar o callback vazio ou simplesmente não passar ele.

Abraços

[/quote]

Obrigado Handerson pelo esclarecimento em alguns pontos até desconhecido por mim.

Olá Handerson meu código ficou assim, mas não consigo ainda entrar no método buscar da classe RemerssaRetornoAjax.
Segue meu código:

[code]function obterCampos(){
var dataInicial = new Object();
var dataFinal = new Object();
var orgaoArrecadador = new Object();
var tipoEnvio = new Object();

dataInicial = document.getElementById('form:dataInicial').value;
dataFinal = document.getElementById('form:dataFinal').value;
orgaoArrecadador.codigo =  document.getElementById('form:orgaoArrecadador').value;
tipoEnvio.descricao = document.getElementById('form:tipoEnvio').value;

alert("Data Inicial: "+ dataInicial + "\n\n"+
	  "Data Final: "+ dataFinal + "\n\n"+
	  "Orgão Arrecadador: "+ orgaoArrecadador.codigo + "\n\n"+
	  "Tipo de Envio: "+ tipoEnvio.descricao);

RemessaRetornoAjax.buscar(dataInicial, dataFinal, orgaoArrecadador, tipoEnvio, {
		callback:function (data){
			alert(data);
		}
	});

}[/code]

A chamada do meu método buscar da classe RemessaRetornoAjax:

public Collection<ArquivoMonitoracaoTO> buscar(Date dataInicial, Date dataFinal, OrgaoArrecadador orgaoArrecadador, TipoEnvio tipoEnvio) throws Exception { ... ... ... }

Olá Anderson.

Vamos seguir alguns passos, para não perdermos tempo.

  1. Você está realmente com o DWR “instalado” no seu projeto corretamente ?

  2. Você mapeou corretamente a classe RemerssaRetornoAjax ?

Para responder essas duas perguntas basta acessar: http://seuprojeto/dwr

Deve aparecer a sua classe RemerssaRetornoAjax. Clique sobre ela e irá carregar uma página com todos os métodos dela, passe os valores para testar e execute.

Nesta página também irá conter todos os importes necessários para que essa sua classe funcione na sua aplicação.

Caso não apareça a classe no http://contexto/dwr então você não mapeou corretamente no dwr.xml ou nas annotations. Exemplo:

<create creator="new" javascript="FacadeAjax" >
      <param name="class" value="com.jm.facade.FacadeAjax"/>
</create>

Caso ao acessar nada apareca ou dê erro, então o DWR não esta configurado corretamente.

Outra coisa, use o FireBug no FireFox, ele irá te dizer algum erro que aconteça no javascript. Você está utilizando ele ?

Abraços

E mais uma coisa que esqueci.

No retorno do seu método você tem um objeto chamado ArquivoMonitoracaoTO. Como você quer ele como retorno ou mesmo que seja como parâmetro, você deve mapear ele no dwr.xml.

[quote=handersonbf]E mais uma coisa que esqueci.

No retorno do seu método você tem um objeto chamado ArquivoMonitoracaoTO. Como você quer ele como retorno ou mesmo que seja como parâmetro, você deve mapear ele no dwr.xml.[/quote]

Olá Handerson, meu retorno não está retorno no javaScript não está chegando nada, acredito que seja meu mapeamento que muito provavelmente está errado. A minha duvida é sobre o retorno e como devo mapear ele.

Segue meu dwr.xml:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd"> <dwr> <allow> <create creator="new" javascript="RemessaRetornoAjax"> <param name="class" value="pacote.RemessaRetornoAjax" /> </create> <convert converter="bean" match="pacote.to.ArquivoMonitoracaoTO" /> <convert converter="bean" match="pacote.vo.OrgaoArrecadador" /> <convert converter="bean" match="pacote.enun.TipoEnvio"/> </allow> </dwr>

Grato!

Creio eu que esteja utilizando a última versão do DWR, a 3.0, ou mesmo até a 2.0.5. Não importa o dtd esta errado da mesma forma, está usando do DWR 1.0

Cara realmente aconselho você dar uma lida nos artigos, pois assim nunca iremos conseguir resolver o problema ou pelo menos descobrir onde está errado.

Os artigos irão dizer o básico do que você precisa, como mapear, como configurar o dwr, como fazer os importes, como testar seus métodos mapeados sem precisar fazer javascript, como fazer as chamadas ao métodos, como recuperar informacoes do formulario com uma linha, nao precisa mapear Bean por Bean basta coloca recepcaoenvio.*, dentre várias outras coisas.

A forma como você esta fazendo a chamada por exemplo já mostrei que está errada, a forma como esta pegando os dados, mostrei como deve ser feito.

Fica complicado ajudar dessa forma ;/ realmente não sei qual a sua dificuldade…

[quote=handersonbf]Creio eu que esteja utilizando a última versão do DWR, a 3.0, ou mesmo até a 2.0.5. Não importa o dtd esta errado da mesma forma, está usando do DWR 1.0

Cara realmente aconselho você dar uma lida nos artigos, pois assim nunca iremos conseguir resolver o problema ou pelo menos descobrir onde está errado.

Os artigos irão dizer o básico do que você precisa, como mapear, como configurar o dwr, como fazer os importes, como testar seus métodos mapeados sem precisar fazer javascript, como fazer as chamadas ao métodos, como recuperar informacoes do formulario com uma linha, nao precisa mapear Bean por Bean basta coloca recepcaoenvio.*, dentre várias outras coisas.

A forma como você esta fazendo a chamada por exemplo já mostrei que está errada, a forma como esta pegando os dados, mostrei como deve ser feito.

Fica complicado ajudar dessa forma ;/ realmente não sei qual a sua dificuldade…

[/quote]

Obrigado Handerson pela força novamente, mas o que você está propondo eu já fiz sim. Aliás ja rodei até seus exemplos e estudei cada código dos exemplos que encontravam no site, mas para o que estou querendo desenvolver não está funcionando. Como você me parece ser uma pessoa experiênte na tecnologia ‘DWR’ resolvi consultar, pois para mim esta tecnologia é muito nova e não tenho experiência, nem muito menos tenho a quem consultar, logo resolvi postar aqui no site e recorer a você.
Mas acredito que sua ajuda até o presente momento já foi suficiente, agradeço pela atenção, pelo tempo gasto comigo e tambem peço desculpas se por ter feito várias perguntas.

Grato!

Não entenda essa minha última mensagem como agressiva :).

Não tenho problemas em responder, só comentei que esta complicado ajudar sem saber qual o erro, seja pelo console do eclipse ou firebug.

Sem problemas cara, se tiver dúvidas pode enviar, ou mandar um email.

Abraços

Não não, a questão não é agressiva não, é que eu sei que é realmente muito complicado ajudar por distância e na insistencia de um mesmo erro. Fica complicado ajudar desta forma, eu entendo totalmente sua situação. Mas como ja falei pelo gtalk fica a informação aqui para as outras pessoas que venham a consultar. Existe uma incompatibilidade entre o DWR, JSF e Navegador, pois o meu código está funcionando apenas no IE 8. Mas não me pergunte porque, tenho um mesmo exemplo sem JSF funcionando no no firefox e Chrom.

Grato.
=]