如何使用EclipseLink和Spring配置动态编织?

如何使用EclipseLink和Spring配置动态编织? 现在我正在尝试使用Junit测试,但后来我必须让它与Tomcat一起工作(我的部门已经标准化了10年之久)。

我遇到两个主要问题:

1. Spring需要一个加载时间织布工:

例外:

java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:181) at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)  Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.context.weaving.AspectJWeavingEnabler#0': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loadTimeWeaver': Initialization of bean failed; nested exception is java.lang.IllegalStateException: ClassLoader [sun.misc.Launcher$AppClassLoader] does NOT provide an 'addTransformer(ClassFileTransformer)' method. Specify a custom LoadTimeWeaver or start your Java virtual machine with Spring's agent: -javaagent:org.springframework.instrument.jar at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)  Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loadTimeWeaver': Initialization of bean failed; nested exception is java.lang.IllegalStateException: ClassLoader [sun.misc.Launcher$AppClassLoader] does NOT provide an 'addTransformer(ClassFileTransformer)' method. Specify a custom LoadTimeWeaver or start your Java virtual machine with Spring's agent: -javaagent:org.springframework.instrument.jar at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)  Caused by: java.lang.IllegalStateException: ClassLoader [sun.misc.Launcher$AppClassLoader] does NOT provide an 'addTransformer(ClassFileTransformer)' method. Specify a custom LoadTimeWeaver or start your Java virtual machine with Spring's agent: -javaagent:org.springframework.instrument.jar at org.springframework.context.weaving.DefaultContextLoadTimeWeaver.setBeanClassLoader(DefaultContextLoadTimeWeaver.java:91) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeAwareMethods(AbstractAutowireCapableBeanFactory.java:1437) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1408) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) ... 44 more 

我可以通过配置Spring Instrumentation来解决这个问题:

 JVM parameter: -javaagent:/path/to/org.springframework.instrument-3.1.0.M2.jar 

2. Eclipselink对Spring Instrumentation不满意:

错误:

 (similar error messages repeated many times) [EL Severe]: 2011-06-20 16:12:57.951--ServerSession(979781372)--Local Exception Stack: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.IntegrityException Descriptor Exceptions: --------------------------------------------------------- Exception [EclipseLink-60] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.DescriptorException Exception Description: The method [_persistence_set_shellType_vh] or [_persistence_get_shellType_vh] is not defined in the object [ps.entity.JudicialArtifactFamily]. Internal Exception: java.lang.NoSuchMethodException: ps.entity.JudicialArtifactFamily._persistence_get_shellType_vh() Mapping: org.eclipse.persistence.mappings.ManyToOneMapping[shellType] Descriptor: RelationalDescriptor(ps.entity.JudicialArtifactFamily --> [DatabaseTable(JUDICIAL_ARTIFACT_FAMILY)]) Exception [EclipseLink-218] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.DescriptorException Exception Description: A NullPointerException would have occurred accessing a non-existent weaved _vh_ method [_persistence_get_shellType_vh]. The class was not weaved properly - for EE deployments, check the module order in the application.xml deployment descriptor and verify that the module containing the persistence unit is ahead of any other module that uses it. 

尝试使用EclipseLink weaver解决这个问题:

 -javaagent:/dev/tools/javaagents/eclipselink.jar 

但是后来我从问题#1得到了同样的例外。

图书馆版本

我在用:

  • Java 1.6.0_24
  • EclipseLink 2.2.0.v20110202-r8913
  • 春季3.1.0 M2

配置文件

这是我的persistence.xml:

   ps.entity.Artifact ps.entity.JudicialArtifactFamily ps.entity.ShellType ps.entity.SourceArtifact ps.entity.Health false       

这是我的application.xml:

               <!--  -->              

对于用Spring编织,我相信你需要像

       jdbc/__default      jdbc/jta          

这里有一些信息,

http://wiki.eclipse.org/EclipseLink/Examples/JPA/JPASpring

确保在访问Spring上下文之前不访问类。

另一种解决方案是使用静态编织。

现在,我也在使用EclipseLink 2.2Spring 3.1 ,如下所示。 我的配置与您的配置略有不同。 loadTimeWeaver中没有loadTimeWeaver配置。 我想,如果你使用如下,那就没关系了。

请尝试使用您的Oracle DB信息,如下所示。

                         false              

org.springframework.instrument-3.1.0.M2.jar复制到tomcat/lib目录并再次尝试。

考虑到unit testing的工具,可以将其作为VM参数添加到maven-surefire-plugin中

  org.apache.maven.plugins maven-surefire-plugin  -javaagent:lib/test/spring-instrument-4.0.2.RELEASE.jar   

假设弹簧乐器jar被放置在相应的位置。

(为此,可以将以下依赖项临时添加到项目pom.xml中

  org.springframework spring-instrument test  

然后在构建之后,相应的工件从本地.m2目录复制到项目的lib / test目录。)