Pergunta

Eu tenho um projeto da Web que também é feito usando o JSF e eu também tenho um módulo EJB. Digo alguns dados em um formulário e tento salvar esses dados em DB através do meu feijão de sessão.

A sequência de etapas é a seguinte.

1) O usuário abre a tela com um formulário
2) Ele preenche os campos de formulário com dados
3) Hits no botão Salvar
4) O feijão gerenciado captura todos os valores inseridos e os adiciona a uma lista de Array (contendo feijões.

for(String tagName : formTagNames){ // For all the tag names in the FORM
 String value = request.getParameter(tagName); // Get the value of the field
 myArrayList.add(new DynamicForm(tagName, value)); // Create a bean & add to list
}

5) Então MyArraylist é enviado ao módulo EJB para persistência. (Eu também fiz o mapeamento corretamente)

@EJB(name="DynamicFormFacadeLocal", mappedName="DynamicFormFacade/local")
private static DynamicFormFacadeLocal dynamicFormFacadeLocal;  

// Send it to EJB module for persistence
dynamicFormFacadeLocal.addDynamicFormFields(myArrayList);  

6) Quando chego ao feijão da sessão e tento iterar MyArraylist

public Integer addDynamicFormFields(ArrayList<DynamicForm> formDetailsList) {
 if(formDetailsList == null || formDetailsList.isEmpty()) return 0;

 setupResources(); // Setting up all necessary connections & stuff
 int count = 0;
 try{
     entityTransaction.begin();
     for(DynamicForm form : formDetailsList){
  entityManager.persist(form);
  count++;
     }
     entityTransaction.commit();
 }
 catch(Exception e){
     e.printStackTrace();
     entityTransaction.rollback();
 }
 finally{
     cleanupResources(); // Cleanup all connections & resources
 }

 return count;
    }

7) Mas isso me dá uma ClassCastException e não entendo por quê .. !! :(

18:17:42,210 INFO  [org.hibernate.impl.SessionFactoryImpl] building session factory
18:17:42,214 INFO  [org.hibernate.impl.SessionFactoryObjectFactory] Not binding factory to JNDI, no JNDI name configured
18:17:42,219 ERROR [STDERR] java.lang.ClassCastException: com.test.dynamiform.beans.entity.DynamicForm cannot be cast to com.test.dynamiform.beans.entity.DynamicForm
18:17:42,219 ERROR [STDERR]  at com.test.dynamiform.beans.session.DynamicFormFacade.addDynamicFormFields(DynamicFormFacade.java:32)
18:17:42,219 ERROR [STDERR]  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
18:17:42,219 ERROR [STDERR]  at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
18:17:42,219 ERROR [STDERR]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
18:17:42,219 ERROR [STDERR]  at java.lang.reflect.Method.invoke(Unknown Source)
18:17:42,220 ERROR [STDERR]  at org.jboss.aop.joinpoint.MethodInvocation.invokeTarget(MethodInvocation.java:122)
.... etc

Alguém pode me ajudar neste .. ???
Estou totalmente perdido aqui enquanto estou enviando e iterando o mesmo tipo de objetos ... :(

Desde já, obrigado.
Asela.

Foi útil?

Solução

Você está no que foi denominado "Classloader Hell".

O tipo de objeto depende da classe e também do carregador de classe que o carregou.

Você terá duas cópias dessa classe implantada em seu servidor, talvez uma no aplicativo da Web e uma no EJB e diferentes bits de código estão pegando a classe de diferentes carregadores de classe.

Remova o aplicativo da web, organize as coisas para que seu aplicativo da web e EJB carregue a classe shaed do mesmo local - muitas vezes a classe no EJB é a melhor aposta.

No entanto, não gosto de EJBs "saber" sobre os objetos de forma, usar uma classe DTO simples pode ser mais limpa, se bastante irritante.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top