【问题标题】:EJB: Passing instance of concrete class to an EJB methodEJB:将具体类的实例传递给 EJB 方法
【发布时间】:2016-08-30 11:21:48
【问题描述】:

假设有一个 EJB 方法接受一个实现了某个接口的对象。

MyStatelessBean.method(InterfaceA aObj);

所以服务器实现了 MyStatelessBean 并且 InterfaceA 在其类路径中可用。

现在InterfaceA 的具体类在客户端实现。这些具体类不在服务器的类路径中。

现在,当客户端调用服务器并将具体类的实例传递给 EJB 方法时,

InterfaceA concreteObjA = new InterfaceA() { ... }   
bean = context.lookup(ejbLookupStr);
bean.method(concreteObjA);

预期的行为是什么?

我在 WildFly 9.0.2 中的测试导致客户端日志中报告了 ClassNotFoundException(但它似乎报告了服务器端问题)。

线程“主”javax.ejb.EJBException 中的异常: java.lang.ClassNotFoundException: [模块中的 org.ktest.study.javaee.ejb.CallBackClient 服务模块中的“deployment.wildfly-ear.ear.wildfly-ejb.jar:main” 装载机] 在 org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:238) 在 org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:183) 在 org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:146) 在 com.sun.proxy.$Proxy0.register(Unknown Source) 在 org.ktest.study.javaee.ejb.ClientObject.main(ClientObject.java:21)

【问题讨论】:

  • 序列化机制需要对象类反序列化成。如果类路径中没有类,ejb 接收器无法反序列化有效负载,因为它找不到类型,因此 classnotfoundexception

标签: java jakarta-ee ejb wildfly


【解决方案1】:

回答我自己的问题:

实际上我的要求是使用 RMI 进行服务器到客户端的回调。服务器提供回调接口。但是由客户提供具体的实现。由于 EJB 使用序列化将对象从客户端传递到服务器,因此它要求具体类在服务器端可用以进行反序列化。

我的 RMI 代码中存在导致错误的错误。

【讨论】:

    猜你喜欢
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多