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

Tom*_*mmy 3 java ejb glassfish eclipselink ejb-3.0

调用会话bean方法从客户端传递方法参数时遇到问题

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

而该方法的过程适用于该对象

例如:

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

提前致谢.

ese*_*sej 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>
Run Code Online (Sandbox Code Playgroud)

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

  • 扩展(这是JPA规范要求实体的非私有默认构造方式)
  • 包皮
  • 类的字节代码操作(使其符合EclipseLink"想要"它的方式)
  • ThreadLocal代理东西
  • 使用属性的基本反射
  • 使用getter setter的基本反射(如果有的话)

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

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

发生在你身上的是,实体是在一端编织而不是在另一端编织 - >绝对不能工作.

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

来自:What_You_May_Need_to_Know_About_Weaving_JPA_Entities 提供EclipseLink明确使用的东西列表:

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

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