Pregunta

Tengo un proyecto web que se realiza utilizando JSF y también tengo un módulo EJB.Introduzco algunos datos en un FORMULARIO e intento guardarlos en la base de datos a través de mi bean de sesión.

La secuencia de pasos es la siguiente.

1) El usuario abre la pantalla con un formulario.
2) Llena los campos del formulario con datos.
3) Pulsa el botón Guardar.
4) El bean administrado captura todos los valores ingresados ​​y los agrega a una ArrayList (que contiene beans de entidad.mostrado a continuación)

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) Entonces miListaArray se envía al módulo EJB para su persistencia.(Yo también he hecho el mapeo correctamente)

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

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

6) Cuando llego al bean de sesión e intento iterar miListaArray

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) ¡¡Pero me da una ClassCastException y no entiendo 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

¿Alguien puede ayudarme con esto?
Estoy totalmente perdido aquí ya que estoy enviando e iterando el mismo TIPO de objetos...:(

Gracias de antemano.
Asela.

¿Fue útil?

Solución

Estás en lo que se ha denominado "Infierno de Classloader".

El tipo de objeto depende de la clase y también del cargador de clases que lo cargó.

Tendrá dos copias de esa clase implementadas en su servidor, tal vez una en la aplicación web y otra en el EJB, y diferentes fragmentos de código recogerán la clase de diferentes cargadores de clases.

Elimine el de la aplicación web, organice las cosas para que su aplicación web y EJB carguen la clase sombreada desde el mismo lugar; a menudo, tener la clase en el EJB es la mejor opción.

Sin embargo, no me gusta que los EJB "sepan" acerca de los objetos de formulario; usar una clase DTO simple puede ser más limpio, aunque bastante molesto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top