Como eu configuro a tecelagem dinâmica usando o EclipseLink & Spring?

Como eu configuro a tecelagem dinâmica usando o EclipseLink & Spring? No momento, estou tentando fazer com que isso funcione com um teste do Junit, mas depois terei que trabalhar com o Tomcat (meu departamento foi padronizado por algo como 10 anos).

Eu estou correndo em dois problemas principais:

1. Spring quer um tecelão de tempo de carregamento:

Exceção:

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 

Eu posso consertar isso configurando o Spring Instrumentation:

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

2. O Eclipselink não está satisfeito com a instrumentação da primavera:

Erro:

 (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. 

Eu tentei consertar isso usando o tecelão EclipseLink:

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

Mas então eu recebo a mesma exceção do problema # 1.

Versões da biblioteca

Estou usando:

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

Arquivos de configuração

Aqui está o meu persistence.xml:

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

Aqui está o meu application.xml:

               <!--  -->              

Para tecer com a spring eu acredito que você precisa de algo como

       jdbc/__default      jdbc/jta          

Há algumas informações aqui,

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

Certifique-se de não estar acessando suas classs antes de acessar o contexto Spring.

Outra solução é usar a tecelagem estática.

Agora, também estou usando o EclipseLink 2.2 e Spring 3.1 como abaixo. Minha configuração é um pouco diferente da sua. Não há configuração loadTimeWeaver no seu eclipseLinkEntityManagerFactory . Eu acho que vai ficar bem se você usar como abaixo.

Por favor, tente como abaixo com sua informação do Oracle DB .

                         false              

copie org.springframework.instrument-3.1.0.M2.jar para o diretório tomcat/lib e tente novamente.

Considerando a instrumentação para testes de unidade, pode-se adicionar como argumento de VM ao plugin maven-surefire

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

assumindo que o jarro de instrumento de mola foi colocado no local correspondente.

(Para isso, a seguinte dependência pode ser adicionada temporariamente ao projeto pom.xml

  org.springframework spring-instrument test  

e depois da compilation, o artefato correspondente copiado do diretório local .m2 para o diretório lib / test do projeto.)