2011-06-20 32 views
9

Làm cách nào để định cấu hình dệt động bằng EclipseLink & Mùa xuân? Ngay bây giờ tôi đang cố gắng để làm việc này với một bài kiểm tra Junit, nhưng sau này tôi sẽ phải làm việc với Tomcat (bộ phận của tôi đã được chuẩn hóa trên nó khoảng 10 năm).Làm cách nào để định cấu hình dệt động bằng EclipseLink & Spring?

Tôi đang chạy vào hai vấn đề chính:

1. Mùa xuân muốn một thợ dệt thời gian tải:

Ngoại lệ:

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) 
<snip> 
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) 
<snip> 
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) 
<snip> 
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 

tôi có thể sửa lỗi này bằng cách cấu hình Instrumentation mùa xuân :

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

2. EclipseLink là không hài lòng với Instrumentation mùa xuân:

Lỗi:

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

tôi thử để sửa lỗi này bằng cách sử dụng các thợ dệt EclipseLink:

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

Nhưng sau đó tôi nhận được cùng ngoại lệ với vấn đề # 1.

phiên bản Thư viện

Tôi đang sử dụng:

  • Java 1.6.0_24
  • EclipseLink 2.2.0.v20110202-r8913
  • mùa xuân 3.1.0 M2

Tệp cấu hình

Đây là persistence.xml tôi:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      version="2.0" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="eclipseLinkHashPU" transaction-type="RESOURCE_LOCAL"> 
     <class>ps.entity.Artifact</class> 
     <class>ps.entity.JudicialArtifactFamily</class> 
     <class>ps.entity.ShellType</class> 
     <class>ps.entity.SourceArtifact</class> 
     <class>ps.entity.Health</class> 
     <exclude-unlisted-classes>false</exclude-unlisted-classes> 
     <properties>  
      <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> 
      <property name="eclipselink.ddl-generation.output-mode" value="database"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

Đây là application.xml tôi:

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jaxrs="http://cxf.apache.org/schema/jaxrs" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:util="http://www.springframework.org/schema/util" xmlns:aop="http://www.springframework.org/schema/aop" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
      http://www.springframework.org/schema/tx 
      http://www.springframework.org/schema/tx/spring-tx-2.0.xsd 
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-2.5.xsd 
      http://cxf.apache.org/schema/jaxrs 
      http://cxf.apache.org/schema/jaxrs.xsd 
      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd   
      http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd 
      http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd"> 

    <context:component-scan base-package="ps"> 
    </context:component-scan> 

    <context:load-time-weaver/> 

    <alias alias="entityManagerFactory" name="eclipseLinkEntityManagerFactory"/> 

    <bean id="eclipseLinkEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="persistenceXmlLocation" value="classpath:eclipselink-persistence.xml" /> 
     <property name="persistenceUnitName" value="eclipseLinkHashPU" /> 
     <property name="jpaPropertyMap"> 
      <map> 
       <entry key="eclipselink.logging.level" value="Severe"/> 
       <entry key="eclipselink.target-database" value="org.eclipse.persistence.platform.database.oracle.OraclePlatform"/> 
       <entry key="javax.persistence.nonJtaDataSource" value-ref="hash1DataSource"/> 
       <!-- it's not good that I'm turning weaving off --> 
       <!-- <entry key="eclipselink.weaving" value="false"/> --> 
      </map> 
     </property> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter"> 
       <property name="databasePlatform" value="oracle" /> 
       <property name="database" value="ORACLE" /> 
       <property name="generateDdl" value="true" /> 
       <property name="showSql" value="true" /> 
      </bean> 
     </property> 
    </bean> 

    <!-- datasources, etc --> 
</beans> 
+0

Bất kỳ giải pháp nào vào năm 2017? – Wecherowski

Trả lời

4

Đối với dệt với mùa xuân Tôi tin rằng bạn cần một cái gì đó như thế nào,

<bean id="persistenceUnitManager" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager"> 
    <property name="defaultDataSource" ref="dataSource" /> 
    <property name="dataSources"> 
     <map> 
      <entry> 
       <key> 
        <value>jdbc/__default</value> 
       </key> 
       <ref bean="dataSource" /> 
      </entry> 
      <entry> 
       <key> 
        <value>jdbc/jta</value> 
       </key> 
       <ref bean="dataSource" /> 
      </entry> 
     </map> 
    </property> 
    <property name="loadTimeWeaver"> 
     <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" /> 
    </property> 
</bean> 

Có một số thông tin tại đây,

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

Đảm bảo bạn không truy cập vào các lớp học của mình trước khi truy cập ngữ cảnh mùa xuân.

Một giải pháp khác là sử dụng dệt tĩnh.

+0

Xin chào @James "Đảm bảo bạn không truy cập vào các lớp học của bạn trước khi truy cập vào bối cảnh mùa xuân". Làm thế nào để đạt được điều này bởi vì tôi đang phải đối mặt với cùng một vấn đề. Xin vui lòng đề nghị. –

1

sao chép org.springframework.instrument-3.1.0.M2.jar vào thư mục tomcat/lib và thử lại.

2

Bây giờ, tôi cũng đang sử dụng EclipseLink 2.2Spring 3.1 như bên dưới. Cấu hình của tôi hơi khác với cấu hình của bạn. Không có cấu hình loadTimeWeaver trong số eclipseLinkEntityManagerFactory của bạn. Tôi nghĩ rằng, nó sẽ là ok nếu bạn sử dụng như dưới đây.

Hãy thử như dưới đây với thông tin Oracle DB của bạn ..

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" 
     xmlns:faces="http://www.springframework.org/schema/faces" 
     xmlns:int-security="http://www.springframework.org/schema/integration/security" 
     xmlns:tx="http://www.springframework.org/schema/tx" xmlns:sec="http://www.springframework.org/schema/security" 
     xmlns:util="http://www.springframework.org/schema/util" 
     xsi:schemaLocation="http://www.springframework.org/schema/integration/security http://www.springframework.org/schema/integration/security/spring-integration-security-2.0.xsd 
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
     http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd 
     http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/faces http://www.springframework.org/schema/faces/spring-faces-2.0.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd"> 

    <context:annotation-config/>  
    <context:component-scan base-package="your-package"/> 
    <tx:annotation-driven transaction-manager="transactionManager" /> 
    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/> 

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="your-driver"/> 
     <property name="url" value="your-database-url"/> 
     <property name="username" value="your-username"/> 
     <property name="password" value="your-passowrd"/> 
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory"/> 
    </bean> 

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
<!--  <property name="dataSource" ref="dataSource"/>--> 
     <property name="persistenceUnitName" value="your-persistence-unit-name"/> 
     <property name="jpaVendorAdapter" ref="jpaVendorAdapter"/> 
     <property name="jpaDialect"> 
      <bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect"/> 
     </property> 
     <property name="jpaPropertyMap"> 
      <props> 
       <prop key="eclipselink.weaving">false</prop> 
      </props> 
     </property> 

     <property name="loadTimeWeaver"> 
      <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"> 
      </bean> 
     </property> 
    </bean> 

    <bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter"> 
     <property name="databasePlatform" value="org.eclipse.persistence.platform.database.OraclePlatform" /> 
     <property name="generateDdl" value="false"/> 
     <property name="showSql" value="true"/> 
    </bean> 
</beans> 
0

Xét bị đo đạc cho unit tests, người ta có thể thêm nó như là đối số VM đến maven-surefire-plugin

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <configuration> 
     <argLine>-javaagent:lib/test/spring-instrument-4.0.2.RELEASE.jar</argLine> 
    </configuration> 
</plugin> 

giả sử bình cụ lò xo được đặt ở vị trí tương ứng.

(Cho rằng, sự phụ thuộc sau đây có thể được bổ sung tạm thời để pom.xml dự án

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-instrument</artifactId> 
    <scope>test</scope> 
</dependency> 

và sau đó sau khi xây dựng, artifact tương ứng sao chép từ thư mục .m2 địa phương vào thư mục lib/thử nghiệm của dự án.)

Các vấn đề liên quan