VRaptor com Ajax a anotação @Parameter não funciona?

6 respostas
Pedrosa

Olá, estou utilizando o VRaptor com Ajax e gostaria de saber como passar parametros para a classe logic, de forma assincrona ele não consegue pegar os valores com a anotação @Parameter.

Meu JSP:

<script>
	function ajaxRequest() {
	    var url = 'pedidocompra.listPedidoCompra.ajax.logic';
	    alert($F('codigoPedido'));
	    var codigoPedido = $F('codigoPedido');
        //create the ajax request
        var myAjax = new Ajax.Request(
                url,
                {
	                method: 'get',
	                parameters: codigoPedido,
	                onComplete: showResponse
                }
        );      
    }

    //ajax callback method
    function showResponse(data) {

         //get the jsonObject
        var jsonObject = eval('(' + data.responseText + ')');

        //get the user array from the json object
        var pedidos = jsonObject.pedidos;
        
        //update html
        var html ="<tr>";
        var total = 0;
       	html+="<table width='100%'>";
       	html+="<tr>";
       	html+="<td colspan='2'><b>Razão Social</b></td>";
		html+="	<td><b>Nome Fantasia</b></td>";
		html+="	<td colspan='2'><b>CNPJ</b></td>";
		html+="</tr>";
		html+="<tr>";
		html+="	<td colspan='2'>"+ pedidos[0].razaoSocial + "</td>";
		html+="	<td>"+ pedidos[0].nomeFantasia + "</td>";
		html+="	<td colspan='2'>"+ pedidos[0].cnpj + "</td>";
		html+="</tr>";
		html+="<tr>";
		html+="	<td colspan='5'><b>Endereço para Coleta</b></td>";
		html+="</tr>";
		html+="<tr>";
		html+="	<td colspan='5'>"+ pedidos[0].enderecoColeta + "</td>";
		html+="</tr>";
		html+="<tr>";
		html+="	<td colspan='2'><b>Nº Pedido</b></td>";
		html+="	<td><b>Data de Emissão</b></td>";
		html+="	<td colspan='2'><b>Data de Coleta</b></td>";
		html+="</tr>";
		html+="<tr>";
		html+="	<td colspan='2'>"+ pedidos[0].numeroPedido + "</td>";
		html+="	<td>"+ pedidos[0].dataEmissao + "</td>";
		html+="	<td colspan='2'>"+ pedidos[0].dataColeta + "</td>";
		html+="</tr>";
		html+="<tr>";
		html+="	<td colspan='5'>&nbsp;</td>";
		html+="</tr>";
		html+="</table>";
		
		//Itens
		html+="<table width='100%' bordercolor='#396666' bordercolordark='white' cellpadding='1' cellspacing='0' rules='rows' frame='below'>";
		html+="<tr>";
		html+="	<td colspan='6' align='center'>LISTA DE ITENS PARA COMPRA</td>";
		html+="</tr>";
		html+="<tr>";
		html+=" <td width='40'><b>Cód.</b></td>";
		html+=" <td width='200'><b>Descrição do Item</b></td>";
		html+="	<td><b>Bloc.</b></td>";
		html+="	<td><b>Qtde. Esperada</b></td>";
		html+="	<td><b>Qtde. Recebida</b></td>";
		html+="	<td><b>Unitário</b></td>";
		html+="	<td><b>Total</b></td>";
		html+="</tr>";
	  
        //Lista de itens para compra

        for(i=0;i<pedidos.length;i++) {
	        html+="<tr>";
			html+="	<td width='40'>"+ pedidos[i].codigoPedido + "</td>";
			html+="	<td width='200'>" + pedidos[i].descricaoIten + "</td>";
			html+="	<td>" + pedidos[i].blocagem + "</td>";
			html+="	<td>" + pedidos[i].quantidadeEsperada + "</td>";
			html+="	<td><input type='text'></td>";
			html+="	<td>" + pedidos[i].unitario + "</td>";
			html+="	<td>" + pedidos[i].total + "</td>";
			total+=pedidos[i].total;
			html+="</tr>";
        }
        html+="<tr>";
		html+="	<td colspan='5'> Total de Itens: "+ pedidos.length + "</td>";
		html+=" <td>Total Geral: " + total + "</td>";
		html+="</tr>";
        html+="</table>"
        var div = document.getElementById("ajaxResultDiv");
        div.innerHTML = html;
    }
</script>
</head>
<body>
<form name="frmPedido" action="pedidocompra.listPedidoCompra.ajax.logic" method="get">
	<table border="0" width="100%" cellpadding="1">
		<tr>
			<td width="150">Entrada de Pedido</td>
			<td width="120">
				<input type="text" name="codigoPedido">
			</td>
			<td class="tdbottom" valign="bottom" align="left">
				 <input type="button" value="ok" name="click" onclick="javascript:ajaxRequest();" >
				 <input type="submit" value="teste">
			</td>
			<td class="tdbottom" valign="bottom" align="right" colspan="2">&nbsp;
				<input type="button" value="sair">
			</td>
		</tr>
		<tr>
			<td colspan="5">&nbsp;</td>
		</tr>
		<tr>
			<td colspan="5" align="center">DADOS DO FORNECEDOR</td>
		</tr>
		<tr>
			<td colspan="5">
				<table width="100%" border="1">
					<tr>
						<td width="100%">
							<div id="ajaxResultDiv"></div>
						</td>
					</tr>
				</table>	
			</td>
		</tr>		
	</table>
</form>	
</body >
</html>

No botão ok eu chama via Ajax e no teste eu submeto o form normal e funciona, estou utilizando o prototype também.

Classe Logic

package br.com.xpto.logic;

import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.vraptor.annotations.Component;
import org.vraptor.annotations.Parameter;
import org.vraptor.annotations.Remotable;

import br.com.xpto.model.PedidoCompra;


//Anotação para registrar a classe de negócio
@Component
public class PedidoCompraLogic {

    //Anotação para obter os dados do request
	@Parameter
	int codigoPedido; 
	
	private List<PedidoCompra> pedidos;
    
     
    
    //Anotação para exibir no formato JSON  
    @Remotable
    public void listPedidoCompra() throws Exception {
    	System.out.println("codigo pedido " + codigoPedido);
    	
    	Format formatter;
    	Date date = new Date(); 
    	formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
	    String s = formatter.format(date);	
    	pedidos = new ArrayList<PedidoCompra>(); 
        
    	
    	//simulando os pedidos do bd
    	for (int i = 1; i < 8; i++) {
        	pedidos.add(new PedidoCompra("Razaão teste" + i,"Nome fantasia" + i,"37179183386763","Endereço coleta" + i,999+i,s,s,i,"Teste Item"+ i,100+i,i+10,10.5+i,20.2+i));
		} 
    }
    
    public List<PedidoCompra> getPedidos() {
        return pedidos;
    } 
    
}

6 Respostas

Pedrosa

Consegui:

function ajaxRequest() {
	    var url = 'pedidocompra.listPedidoCompra.ajax.logic';
	    alert($F('codigoPedido'));
	    var codigoPedido = $F('codigoPedido');
	    var pars = 'codigoPedido=' + codigoPedido;
	    //create the ajax request
        var myAjax = new Ajax.Request(
                url,
                {
	                method: 'get',
	                parameters: pars,
	                onComplete: showResponse
                }
        );      
    }
Guilherme_Silveira

Mais rapido do que eu ler…

Pedrosa

Cara agora ocorreu outra situação, tenho uma tela com 2 campos um inteiro e uma String, onde ele pode informar valores para uma pesquisa, eu uso a anotação @Parameter do tipo inteiro ele da pau caso não venha valor, o que não acontece com o tipo String, vendo pelo log4j ele causa a seguinte Exception:

Caused by: java.lang.NumberFormatException: For input string: ""
	at java.lang.NumberFormatException.forInputString(Unknown Source)
	at java.lang.Integer.parseInt(Unknown Source)
	at java.lang.Integer.parseInt(Unknown Source)
	at org.vraptor.converter.basic.PrimitiveIntConverter.convert(PrimitiveIntConverter.java:18)
	... 31 more

Consegui contarnar no javascript, mas como resolver pelo VRaptor?

function ajaxRequest() {
	    var url = 'produto.listProduto.ajax.logic';
	    var codigoProduto = $F('codigoProduto');
	    if(codigoProduto.length==0){
	    	codigoProduto = 0;
	    }
	    var descricaoProduto = $F('descricaoProduto');
	    var pars = 'codigoProduto=' + codigoProduto + "&descricaoProduto=" + descricaoProduto;
	    //create the ajax request
        var myAjax = new Ajax.Request(
                url,
                {
	                method: 'post',
	                parameters: pars,
	                onComplete: showResponse 
                }
        );      
    }

Se retirar o esse if no javascript, causa a tau Exception:

if(codigoProduto.length==0){
    	codigoProduto = 0;
 }
Guilherme_Silveira

Sugestao 1: usar Integer em vez de int…

se voce usa int, o campo vazio tem que dar pau, afinal vazio é diferente de zero
se voce usar Integer, o campo vazio quer dizer NULL, afinal null é diferente de zero

(teoria do NULL is NULL)

Pedrosa

Perfeito!

V

Olá pessoal, estou começando a utilizar o vRaptor, mas estou com problemas para separar as páginas, ou seja, colocá-las em um diretório diferente de webContent.
Só consegui fazer isto chamando o ajax desta forma:
var url = ‘${pageContext.request.contextPath}/user.salvar.ajax.logic’;

é assim mesmo?

Obrigado

Criado 28 de março de 2007
Ultima resposta 16 de jun. de 2008
Respostas 6
Participantes 3