[RESOLVIDO] VRaptor - Receber lista de um form html

12 respostas
bglbruno

Olá Pessoal, boa noite!

Tenho o seguinte cenário: Uma classe que contém uma lista
@Entity
public class Documentacao {
	@Id @GeneratedValue
	private Long idDocumentacao;

	@OneToMany
	@JoinColumn
	private List<HoraExtra> horasExtras = new ArrayList<HoraExtra>();

	/* getters e setters e outros atributos */
}
E na classe HoraExtra
@Entity
public class HoraExtra{
	@Id @GeneratedValue
	private Long idHoraExtra;
	
	@OneToOne
	@JoinColumn
	private Funcionario funcionario;

	@OneToMany(cascade=CascadeType.ALL)
	@JoinColumn
	private List<DataHoraExtra> dataHoraExtra = new ArrayList<DataHoraExtra>();
}
A classe DataHoraExtra
@Entity
public class DataHoraExtra {
	@Id @GeneratedValue
	private Long idData;
	
	@Type(type = "org.joda.time.contrib.hibernate.PersistentLocalDateTime")
	private LocalDateTime data;
}
Essas horas extras são adicionadas dinamicamente no formulário. Conforme o usuário vai inserindo os dias, eu vou gerando inputs com os names da seguinte forma
Adiciona um funcionário
documentacao.horasExtras[0].funcionario.idFuncionario

Adiciona um dia de hora extra
documentacao.horasExtras[0].dataHoraExtra[0].idData
documentacao.horasExtras[0].dataHoraExtra[0].data

Adiciona outro dia de hora extra
documentacao.horasExtras[0].dataHoraExtra[1].idData
documentacao.horasExtras[0].dataHoraExtra[1].data
Quando eu envio o formulário, é lançada a exception
br.com.caelum.vraptor.http.InvalidParameterException
...
Caused by: java.lang.ArrayIndexOutOfBoundsException: 0

Acredito que isso esteja acontecendo porque estou passando os números do array nos [] dos names, porém essa é a única forma que achei de fazer corretamente essa hierarquia.
Alguém sabe outra forma, ou onde estou errando?

Desde já agradeço!

12 Respostas

Lucas_Cavalcanti

tenta tirar o new ArrayList daqui:

private List<DataHoraExtra> dataHoraExtra = new ArrayList<DataHoraExtra>();
bglbruno

Olá Lucas!
Mesmo erro cara!

br.com.caelum.vraptor.http.InvalidParameterException: Exception when trying to instantiate Target(name=documentacao, type=class br.com.nextrans.erp.modelo.bean.operacional.DocumentacaoFrete)
...
Caused by: java.lang.ArrayIndexOutOfBoundsException: 0

Aqui o log um pouco antes de lançar a exception

22:49:52,191 DEBUG [VRaptor             ] VRaptor received a new request
22:49:52,211 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor
22:49:52,211 DEBUG [DefaultResourceTranslator] trying to access /documentacao/adiciona/NORMAL
22:49:52,215 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: DocumentacaoController.adicionaDocumentacaoController.adiciona(DocumentacaoFrete)]
22:49:52,228 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor
22:49:52,231 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InstantiateInterceptor
22:49:52,246 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExceptionHandlerInterceptor
22:49:52,268 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor HibernateTransactionInterceptor
22:49:52,271 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor LoginInterceptor
22:49:52,273 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor DataHoraInterceptor
22:49:52,285 DEBUG [IogiParametersProvider] IogiParametersProvider is up
22:49:52,297 DEBUG [LazyInterceptorHandler] Invoking interceptor ParametersInstantiatorInterceptor
22:49:52,298 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for DocumentacaoController.adiciona(DocumentacaoFrete) as [documentacao]
22:49:52,300 DEBUG [IogiParametersProvider] getParametersFor() called with parameters Parameters(Parameter(documentacao.despesaCombustiveis[0].valorUnitario -&gt; 456), Parameter(documentacao.reembolsados[0].despesas[0].valor -&gt; 123), Parameter(documentacao.reembolsados[0].funcionario.idBeneficiario -&gt; 92), Parameter(documentacao.emissao.emitenteAlteracao.idUsuario -&gt; 1), Parameter(documentacao.frete.idFrete -&gt; 47), Parameter(documentacao.horasExtras[0].dataHoraExtra[0].idData -&gt; ), Parameter(documentacao.horasExtras[0].dataHoraExtra[0].data -&gt; 01/05/2012 00:00), Parameter(documentacao.despesaCombustiveis[0].combustivel.idMaterial -&gt; 1), Parameter(documentacao.horasExtras[0].funcionario.nome -&gt; Bruno Gonçales Lima), Parameter(documentacao.horasExtras[0].idHoraExtra -&gt; ), Parameter(documentacao.despesaCombustiveis[0].idControle -&gt; ), Parameter(documentacao.despesaCombustiveis[0].litros -&gt; 345), Parameter(documentacao.reembolsados[0].idReembolsado -&gt; ), Parameter(documentacao.reembolsados[0].funcionario.nome -&gt; Bruno Gonçales Lima), Parameter(documentacao.reembolsados[0].despesas[0].descricao -&gt; teste), Parameter(documentacao.despesaCombustiveis[0].data -&gt; 01/05/2012 00:00), Parameter(documentacao.reembolsados[0].despesas[0].despesa.idDespesa -&gt; 25), Parameter(documentacao.despesaCombustiveis[0].equipamento.idEquipamento -&gt; 439), Parameter(documentacao.status -&gt; ABERTO), Parameter(documentacao.emissao.idEmissao -&gt; ), Parameter(documentacao.horasExtras[0].funcionario.idBeneficiario -&gt; 92), Parameter(documentacao.reembolsados[0].despesas[0].despesa.nome -&gt; Hotel), Parameter(documentacao.emissao.emitente.idUsuario -&gt; 1), Parameter(documentacao.tipoFrete -&gt; NORMAL), Parameter(documentacao.despesaCombustiveis[0].quilometragem -&gt; 456)) and targets [Target(name=documentacao, type=class br.com.nextrans.erp.modelo.bean.operacional.DocumentacaoFrete)].
22:49:52,300 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for DocumentacaoFrete() as []
22:49:52,301 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for Frete() as []
Lucas_Cavalcanti

tire esse new ArrayList de todas as classes

bglbruno

Cara, removi de todas as list agora, mas continua o mesmo erro, não mudou nada.

Lucas_Cavalcanti

verifica se no caminho dos parâmetros que vc tá passando na requisição tem algum new ArrayList, mesmo que seja em algum setter.

e dá um clean no servidor e no projeto só pra garantir.

bglbruno

Fiz tudo isso, mesmo erro ainda.
O problema não está no html será?

Lucas_Cavalcanti

baixe esse jar e coloque no projeto e tente de novo. Tire o pacote do iogi do web.xml, se estiver lá.
https://github.com/caelum/vraptor/blob/master/vraptor-core/lib/optional/ognl/ognl-2.7.3.jar

bglbruno

Lucas, fiz o que falou.

O Vraptor reclamou de uma interface que eu retornava num getter, então mudei pra retornar a classe concreta.
Agora o erro mudou

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.com.nextrans.erp.modelo.bean.operacional.DespesaCombustivel

E o log do hibernate é o seguinte

Hibernate: 
    select
        nextval ('seq_documentacao_id')
Hibernate: 
    select
        nextval ('seq_emissao_id')
23:48:31,475 DEBUG [DefaultLogicResult  ] redirecting to class DocumentacaoController
23:48:31,770 DEBUG [CglibProxifier      ] a proxy for class br.com.nextrans.erp.controller.DocumentacaoController is created as class br.com.nextrans.erp.controller.DocumentacaoController$$EnhancerByCGLIB$$aa0103a9
23:48:31,775 DEBUG [DefaultLogicResult  ] redirecting to /erpNextrans/documentacao/pendentes/list
23:48:31,792 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ForwardToDefaultViewInterceptor
23:48:31,792 DEBUG [ForwardToDefaultViewInterceptor] Request already dispatched and commited somewhere else, not forwarding.
Hibernate: 
    /* insert br.com.nextrans.erp.modelo.bean.Emissao
        */ insert 
        into
            Emissao
            (dataAlteracao, dataEmissao, emitente_idUsuario, emitenteAlteracao_idUsuario, idEmissao) 
        values
            (?, ?, ?, ?, ?)
Hibernate: 
    /* insert br.com.nextrans.erp.modelo.bean.operacional.DocumentacaoFrete
        */ insert 
        into
            DocumentacaoFrete
            (emissao_idEmissao, status, tipoFrete, frete_idFrete, idDocumentacao) 
        values
            (?, ?, ?, ?, ?)
Hibernate: 
    /* create one-to-many row br.com.nextrans.erp.modelo.bean.operacional.Documentacao.despesaCombustiveis */ update
        DespesaCombustivel 
    set
        despesaCombustiveis_idDocumentacao=? 
    where
        idControle=?

Acho que ele deveria dar insert ao invés de update nessa última query, não é?

Lucas_Cavalcanti

vc tá salvando uma DespesaCombustivel nova, junto com os outros dados?

se sim, vc precisa colocar cascade=PERSIST no relacionamento (se fizer sentido), ou salvar a despesa antes de salvar a documentação

bglbruno

Deu certo Lucas, adicionei os Cascades onde precisava e adicionou corretamente. Valeu cara!
E em relação ao ognl, preciso mante-lo? O que muda dele pro iogi?

Obrigado!

Lucas_Cavalcanti

na maioria dos casos nada =) mas o IOGI não curte quando vc cria as listas na mão… tem que deixar ele fazer isso.

bglbruno

Entendi!
Valeu Lucas, abraço!

Criado 29 de maio de 2012
Ultima resposta 30 de mai. de 2012
Respostas 12
Participantes 2