ClassCastException при передаче данных в модуль EJB

У меня есть веб-проект, который выполняется с использованием JSF, и у меня тоже есть модуль EJB. Я ввожу некоторые данные в ФОРМУ и пытаюсь сохранить эти данные в БД через свой сеансовый компонент.

Последовательность шагов следующая.

1) Пользователь открывает экран с формой
2) Он заполняет поля формы данными
3) Нажимает кнопку сохранения
4) Управляемый компонент захватывает все введенные значения и добавляет их в ArrayList (содержащий компоненты Entity. показано ниже)

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) Затем myArrayList отправляется модулю EJB для сохранения. (Я тоже правильно сделал отображение)

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

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

6) Когда я добираюсь до сессионного компонента и пытаюсь выполнить итерацию через 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) Но это дает мне ClassCastException, и я не понимаю, почему .. !! :(

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

Может кто-нибудь помочь мне с этим .. ???
Я совершенно потерялся здесь, поскольку я отправляю и повторяю один и тот же ТИП объектов ... :(

Заранее спасибо.
Асела.


person Asela    schedule 05.01.2011    source источник
comment
Как упакованы web и ejb? В одно ухо или как отдельные приложения? И как сделать класс DymanicForm видимым для обоих?   -  person andbi    schedule 06.01.2011


Ответы (1)


Вы попали в то, что было названо «адом загрузчика классов».

Тип объекта зависит от класса, а также от загрузчика классов, который его загрузил.

У вас будет две копии этого класса, развернутые на вашем сервере, возможно, одна в веб-приложении и одна в EJB, и разные фрагменты кода берут класс из другого загрузчика классов.

Удалите один из веб-приложения, расположите все так, чтобы ваше веб-приложение и EJB загружали класс shaed из одного и того же места - часто лучше всего иметь класс в EJB.

Однако мне не нравится, что EJB-компоненты «знают» об объектах формы, использование простого класса DTO может быть более чистым, хотя и довольно раздражающим.

person djna    schedule 05.01.2011