EJB Glassfish v3.1.2客户端将数据传递给会话bean始终为null

时间:2012-06-04 22:26:41

标签: java glassfish ejb ejb-3.0 eclipselink

调用会话bean方法从客户端

传递方法参数时遇到问题

应用程序,数据到达方法调用始终为null或设置为默认值。

虽然该方法的过程适用于对象

例如:

- 我们有持久化对象实体addStudent(学生)的方法; - 从客户端我们创建学生对象设置学生字段,如学生姓名等,调用方法addStudent(ourStudent); 这个ourStudent到达方法,其字段为null或默认值。学生加入了 这些空地。

提前致谢。

1 个答案:

答案 0 :(得分:6)

您正在使用EclipseLink进行编织,但它不起作用。你应该尝试不编织。 可能是通过编辑您的persistence.xml(s)

<persistence-unit name="XXX" transaction-type="XXX">
    <jta-data-source>XXX</jta-data-source>
    <jar-file>Or List of Classes or something else</jar-file>
    <properties>
      [other properties]
      <property name="eclipselink.weaving" value="false"/>
    </properties>
  </persistence-unit>

更新: JPA实现可以使用几种替代方法来处理实体,这是一个无用的列表:

  • 扩展(这是JPA规范要求非私有默认值的方式 实体的构造者)
  • 包装
  • 类的字节代码操作(使其符合EclipseLink“想要”的方式)
  • ThreadLocal proxy thingie
  • 使用属性的基本反射
  • 使用getter setter进行基本反射(如果有的话)

EclipseLink调用字节代码注入“Weaving”(What is Java bytecode injection?) 动态编织在“运行时”进行编织 - 基本上是在类加载器加载类时。 静态编织在部署之前进行编织,但是在编译之后。 对于EclipseLink,编织是性能最快的方法,它也是出于其他原因的首选方法。不幸的是,编织工作通常有点棘手。完全有可能这对你的项目来说都不重要,它不适用于很多典型的项目。

如果有客户端通过远程接口访问bean,并且有实体作为参数传递或通过该连接返回值,则动态编织将不起作用。 在大多数生产场景中,特别是如果应用程序/产品不是很小,静态编织优先于动态编织... 要阅读有关静态与动态编织以及如何配置它的更多信息,我还没有找到任何优秀的资源,但这个至少是半官方的: Using_EclipseLink_JPA_Weaving

发生在你身上的是,实体是在一端编织而不是在另一端编织 - &gt;绝对不行。

好消息是,您可能根本不需要关心任何这种编织物,或者您可能。 当您禁用编织时,EclipseLink回退到另一种处理JPA实体的方法。 如果启用编织,EclipseLink仅支持一些函数(尽管不需要JPA)。

来自:What_You_May_Need_to_Know_About_Weaving_JPA_Entities 列出了EclipseLink明确使用的东西:

  • 延迟加载(间接)
  • 更改跟踪
  • 获取群组
  • 内部优化

(对于其中一些方法,如果禁用编织,其他方法会有后备,我猜除了“内部优化”之外的其他方法)