0

我有一个使用 JSF 完成的 Web 项目,我也有一个 EJB 模块。我在 FORM 中输入了一些数据并尝试通过我的会话 bean 将这些数据保存到 DB。

步骤顺序如下。

1)用户使用表单打开屏幕
2)他用数据填充表单字段
3)点击保存按钮
4)托管 bean 捕获所有输入的值并将它们添加到 ArrayList(包含实体 bean。如下所示)

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)当我到达会话 bean 并尝试遍历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

有人可以帮我解决这个问题吗..???
我在这里完全迷失了,因为我正在发送和迭代相同类型的对象...... :(

提前致谢。
阿塞拉。

4

1 回答 1

1

你处于所谓的“类加载器地狱”中。

对象的类型取决于类以及加载它的类加载器。

您将在服务器中部署该类的两个副本,可能一个在 Web 应用程序中,一个在 EJB 中,并且不同的代码位正在从不同的类加载器中获取该类。

从 Web App 中删除一个,安排一些事情,以便您的 Web App 和 EJB 从同一个地方加载 shaed 类 - 通常在 EJB 中拥有类是最好的选择。

但是,我不喜欢 EJB “了解” Form 对象,使用简单的 DTO 类可能会更干净,如果相当烦人的话。

于 2011-01-05T13:47:11.570 回答