2011-01-05 4 views
0

J'ai un projet Web qui est fait en utilisant JSF & J'ai également un module EJB. J'entre des données dans un FORMULAIRE & essayez de sauvegarder ces données dans la base de données via mon bean session.ClassCastException lors du transfert de données au module EJB

La séquence d'étapes est la suivante.

1) L'utilisateur ouvre l'écran avec une forme
2) Il remplit les champs de formulaire avec des données
3) le nombre de clics sur le bouton Enregistrer
4) Le managed bean capture toutes les valeurs saisies & les ajoute à un ArrayList (contenant des haricots entité. ci-dessous)

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) Ensuite myArrayList est envoyé au module EJB de persistance. (Je l'ai fait la mise en correspondance correctement aussi)

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

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

6) Quand je tends la bean session & essayer de itérer 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) Mais il me donne un ClassCastException & Je don Je ne comprends pas pourquoi .. !! :(

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 

Quelqu'un peut-il s'il vous plaît me aider celui-ci .. ???
Je suis totalement perdu ici que j'envoie & itérer le même type d'objets ... :(

Merci à l'avance.
Asela.

+0

Comment web et ejb sont empaquetés? Dans une seule oreille ou en tant qu'applications autonomes? Et comment la classe DymanicForm est rendue visible aux deux? – Osw

Répondre

1

Vous êtes dans ce qu'on a appelé « Classloader Hell ».

le type d'un objet dépend de la classe et aussi le cla ssloader qui l'a chargé.

Vous aurez deux copies de cette classe déployées sur votre serveur, peut-être une dans l'application Web et une dans l'EJB et différents bits de code récupèrent la classe de différents classloader.

Enlevez celui de l'application Web, arranger les choses pour que votre application Web et EJB charger la classe shaed à partir du même endroit - avoir souvent la classe dans l'EJB est le meilleur pari.

Cependant, je n'aime pas que les EJB "connaissent" les objets Form, l'utilisation d'une simple classe DTO peut être plus propre si elle est plutôt ennuyante.

Questions connexes