VRaptor + submit de array de formulario

3 respostas
alias

Olá amigos, Se puderem me ajudar, por gentileza,

Estou tentando isso no VRaptor:

<form>
<input name="testes[0].atributo.endereco" />
<input name="testes[0].atributo.numero" />
<input name="testes[0].atributo.cidade" />
<input name="testes[0].atributo.estado" />
</form>

e no controller:

public void action(Teste[] testes) {
}

Minha intenção era que chegasse no metodo o array com apenas uma posicao (e os campos do objeto preenchidos). Mas o tamanho do array, no controller, é 4. Sendo que o primeiro item tem os campos preenchidos com o que veio na requisição, e os outros, não. Minha impressão é que o array está sendo criado com o numero de ocorrencias em que o parametro aparece na requisição (no caso, 4).

Dando uma olhada aqui no IOGI, me parece que o problema está nessa linha:

https://github.com/rafaeldff/Iogi/blob/master/src/br/com/caelum/iogi/collections/ParametersByIndex.java#L63

Se esse mapa representa os parametros agrupados por chave ([0], [1], etc), então o tamanho total do array a ser criado seria keys.size(), não values.size()

(esse código é invocado aqui: https://github.com/rafaeldff/Iogi/blob/master/src/br/com/caelum/iogi/collections/ArrayInstantiator.java#L54)

Ou o meu jeito de usar o array está incorreto? Já fiz um teste recebendo um List e funcionou, mas nesse caso específico gostaria de usar o array (pra reaproveitar um método que já existe)

Obrigado!

3 Respostas

Rafael_Guerreiro

Trabalhe com Listas…

No caso, “(pra reaproveitar um método que já existe)”, troque o método para listas ou faça assim:

lista.toArray(new Teste[0]);

DICA: Você pode usar o “Arrays.asList(testes)” para transformar de Array para Listas…

alias

Rafael Guerreiro:
Trabalhe com Listas…

No caso, “(pra reaproveitar um método que já existe)”, troque o método para listas ou faça assim:

lista.toArray(new Teste[0]);

DICA: Você pode usar o “Arrays.asList(testes)” para transformar de Array para Listas…

Pois é, é que o tal método já existente é exposto como serviço rest, e eu não tava muito numas de mudar o parametro de entrada dele hehe…eu estou fazendo como voce sugeriu, recebo a lista na outra action, converto pro array e passo pro outro metodo. De qualquer forma, esse negocio de receber o array nao deveria funcionar?

Rafael_Guerreiro

Sim, deveria… Mas considerando o fato de que Array quase sempre é um péssimo negócio, vale mais a pena você modificar a sua action.

Como ela já está sendo usada, você pode fazer algo assim:

@Component
public class CustomArrayInstantiator implements Instantiator&lt;Object&gt; {
// copie aquela classe e troque justamente a parte que está dando problema.
}
Criado 1 de novembro de 2013
Ultima resposta 1 de nov. de 2013
Respostas 3
Participantes 2