2012-07-30 46 views
9

Tôi đang cố triển khai giải pháp bằng cách sử dụng kết hợp eclipselink (2.4.0) và spring-data-jpa (1.1.0.RELEASE). Tuy nhiên, mỗi khi tôi triển khai các giải pháp (Tomcat 7), tôi nhận được ngoại lệ sau đây:Dữ liệu liên kết và dữ liệu mùa xuân

Caused by: java.lang.IllegalArgumentException: No [ManagedType] was found for 
the key class [com.acme.domain.entities.User] in the Metamodel - please 
verify that the [Managed] class was referenced in persistence.xml using a 
specific <class>com.acme.domain.entities.User</class> property or a global 
<exclude-unlisted-classes>false</exclude-unlisted-classes> element. 

Nó dường như xảy ra khi autowiring kho diễn ra (ví dụ mã dưới đây):

lớp Service

@Component 
public class UserDataService { 

    @Autowired 
    private UserRepository userRepository; 

    ... 
} 

Entity lớp

package com.acme.domain.entities; 

... 

@Entity 
@Table(name = "users") 
public class User implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "user_id") 
    private Integer id; 

    ... 

} 

persistence.xml

<persistence-unit name="default" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>  
    <class>com.acme.domain.entities.User</class> 

    ... 
</persistence-unit> 

Điều này có thể là do xung đột giữa mùa xuân và eclipselink không?

UPDATE:

stacktrace ...

[#|2012-07-31 16:25:02,317|ERROR|pool-2-thread-40|org.springframework.web.context.ContextLoader|Context initialization failed|#] 
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userDataService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.acme.data.repositories.UserRepository com.acme.data.services.UserDataService.userRepository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: No [ManagedType] was found for the key class [com.acme.domain.entities.User] in the Metamodel - please verify that the [Managed] class was referenced in persistence.xml using a specific <class>com.acme.domain.entities.User</class> property or a global <exclude-unlisted-classes>false</exclude-unlisted-classes> element. 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:287) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:609) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:469) 
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:383) 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283) 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112) 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4779) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5273) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:897) 
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:873) 
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615) 
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:958) 
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1599) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:680) 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.acme.data.repositories.UserRepository com.acme.data.services.UserDataService.userRepository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: No [ManagedType] was found for the key class [com.acme.domain.entities.User] in the Metamodel - please verify that the [Managed] class was referenced in persistence.xml using a specific <class>com.acme.domain.entities.User</class> property or a global <exclude-unlisted-classes>false</exclude-unlisted-classes> element. 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:512) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:92) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:284) 
    ... 27 more 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: No [ManagedType] was found for the key class [com.acme.domain.entities.User] in the Metamodel - please verify that the [Managed] class was referenced in persistence.xml using a specific <class>com.acme.domain.entities.User</class> property or a global <exclude-unlisted-classes>false</exclude-unlisted-classes> element. 
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:149) 
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:102) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1442) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:305) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:876) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:818) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:735) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:484) 
    ... 29 more 
Caused by: java.lang.IllegalArgumentException: No [ManagedType] was found for the key class [com.acme.domain.entities.User] in the Metamodel - please verify that the [Managed] class was referenced in persistence.xml using a specific <class>com.acme.domain.entities.User</class> property or a global <exclude-unlisted-classes>false</exclude-unlisted-classes> element. 
    at org.eclipse.persistence.internal.jpa.metamodel.MetamodelImpl.entityEmbeddableManagedTypeNotFound(MetamodelImpl.java:174) 
    at org.eclipse.persistence.internal.jpa.metamodel.MetamodelImpl.managedType(MetamodelImpl.java:489) 
    at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.<init>(JpaMetamodelEntityInformation.java:58) 
    at org.springframework.data.jpa.repository.support.JpaEntityInformationSupport.getMetadata(JpaEntityInformationSupport.java:65) 
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getEntityInformation(JpaRepositoryFactory.java:149) 
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:87) 
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:70) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:137) 
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:125) 
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:41) 
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142) 
    ... 37 more 
+0

bạn có thể bao gồm dấu vết ngăn xếp đầy đủ hay không. Nó chỉ là siêu mô hình hoặc làm những thứ khác không hoạt động? – James

+0

Tôi đã thêm stacktrace ở trên - tất cả đều hoạt động tốt miễn là tôi thêm triển khai kho lưu trữ của riêng mình, tức là phần eclipselink của câu đố là tốt. Ngay sau khi tôi thêm spring-data-jpa vào hỗn hợp, ở trên xảy ra ... – NubieJ

+0

Có vấn đề tương tự chính xác này trong một Ứng dụng độc lập, mọi bản cập nhật? – JBA

Trả lời

1

tôi đã có thể giải quyết vấn đề của tôi, nhưng nó cũng là một thiết lập như trên, tôi chỉ cần thêm một vài điều tôi tình cờ cho đến khi tôi đã có thể giải quyết nó trong Môi trường SE của mình:

  • Lỗi https://bugs.eclipse.org/bugs/show_bug.cgi?id=338837 ảnh hưởng đến EclipseLink Phiên bản 2.2.0 và các phiên bản bên dưới. Chủ yếu xảy ra trong môi trường địa phương (RESOURCE_LOCAL). Một EclipseLink phiên bản nâng cấp hoặc cách khắc phục sau đây có thể giúp:
<exclude-unlisted-classes>false</exclude-unlisted-classes> 
  • Có nhiều file persistence.xml trong classpath (ví dụ đặc biệt là trong lọ bên thứ 3) rằng tất cả xác định cùng kiên trì đơn vị tên tuổi (ở trên "mặc định" có thể rất phổ biến). Hãy thử đổi tên tên đơn vị liên tục của bạn trong trường hợp này là bước đầu tiên

  • Trong trường hợp đổi tên tên đơn vị hoạt động nhưng thay đổi lại giá trị cũ sẽ tái tạo vấn đề thì có JAR bên thứ ba được đề cập ở trên hoặc lọ cũ của dự án của riêng bạn beeing bao gồm để xây dựng của bạn (ví dụ như refactoring/đổi tên vào mức độ dự án hoặc tương tự thay đổi cấu trúc ví dụ như vậy một maven xây dựng vẫn có thể kéo dài tuổi xây dựng hiện vật từ các kho lưu trữ)

Finaly khi nói đến thiết lập của tôi (ứng dụng Spring-Standalone, không persistence.xml nhưng tấn cấu hình Spring vì một khung công ty tùy chỉnh được sử dụng) nó cho thấy rằng tôi chỉ quên quảng cáo d gói thực thể của lõi khung làm việc tùy chỉnh khi tôi muốn chạy một trong các triển khai dịch vụ của họ (triển khai Spring-Bean) trong dự án cục bộ của tôi thay vì thực hiện dịch vụ của họ từ một phụ thuộc JAR. Vì vậy, hãy chắc chắn rằng bạn có tất cả các gói thực thể cần được liệt kê cho EntityManagerFactory của bạn:

<bean id="customEntityManagerFactory" parent="abstractEntityManagerFactory"> 
     <property name="dataSource" ref="dataSource"/> 


     <!-- Packages of EntityClasses --> 
     <property name="packagesToScan"> 
      <list merge="true"> 
       <value>ch.company.div1.foo.bar.model</value> 
       <value>ch.company.div1.foo.barnicle.model</value> 
       <value>ch.company.div2.we.help.model</value> 
      </list> 
     </property> 

     <property name="jpaProperties"> 
      <props merge="true"> 
       <prop key="eclipselink.target-database">org.eclipse.persistence.platform.database.SQLServerPlatform 
       </prop> 
       <prop key="javax.persistence.transactionType">RESOURCE_LOCAL</prop> 
      </props> 
     </property> 
    </bean> 

Trong trường hợp của tôi tôi quên để thêm mô hình packagege với entitys sử dụng các bộ phận khác (mà viết cốt lõi khuôn khổ tùy chỉnh) của Công ty của chúng tôi.

Chúc may mắn, lỗi đó là một con thú:/

0

Không chắc chắn nếu bạn đang gặp vấn đề tương tự tôi đã: cố gắng để tạo ra 2 nhà máy thực thể khác nhau ... Trường hợp ngoại lệ là như nhau, như vậy có lẽ điều này sẽ giúp . Về cơ bản ngoại lệ này đã xảy ra khi nó đã khởi tạo một thực thể trên EntityManagerFactory sai.

Dự án của tôi đang chạy tốt với một kết nối cơ sở dữ liệu duy nhất nhưng khi tôi thêm một thứ hai, EclipseLink đã nhầm lẫn về nơi để khởi tạo các thực thể của tôi. Sau một vài sửa lỗi, kết luận của tôi là xóa thuộc tính "packagesToScan" khỏi tệp root-context.xml của tôi và thay thế bằng "persistenceXmlLocation". Trong XML đó, tôi liệt kê tất cả các lớp học tôi cần phải được quét và loại trừ tất cả mọi thứ khác với "< loại trừ-chưa niêm yết-lớp >"

Dưới đây là cấu hình XML đầy đủ của tôi hiện đang làm việc:

gốc ngữ cảnh. xml

<bean id="dataSource1" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="org.postgresql.Driver" /> 
    <property name="url" value="jdbc:postgresql://server1.example.com:5432/db1" /> 
    <property name="username" value="username" /> 
    <property name="password" value="password" /> 
    <property name="defaultAutoCommit" value="false" /> 
    <property name="initialSize" value="5" /> 
    <property name="maxIdle" value="5" /> 
    <property name="validationQuery" value="SELECT 1" /> 
    <property name="timeBetweenEvictionRunsMillis" value="600000" /> 
    <property name="poolPreparedStatements" value="true" /> 
    <property name="maxOpenPreparedStatements" value="10" /> 
</bean> 

<bean id="dataSource2" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="org.postgresql.Driver" /> 
    <property name="url" value="jdbc:postgresql://server2.example.com:5432/db2" /> 
    <property name="username" value="user" /> 
    <property name="password" value="password" /> 
    <property name="defaultAutoCommit" value="false" /> 
    <property name="initialSize" value="5" /> 
    <property name="maxIdle" value="5" /> 
    <property name="validationQuery" value="SELECT 1" /> 
    <property name="timeBetweenEvictionRunsMillis" value="600000" /> 
    <property name="poolPreparedStatements" value="true" /> 
    <property name="maxOpenPreparedStatements" value="10" /> 
</bean> 


<bean id="emf1" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource1" /> 
    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence1.xml" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter"> 
      <property name="showSql" value="false" /> 
     </bean> 
    </property> 
    <property name="jpaPropertyMap"> 
     <map> 
      <entry key="eclipselink.weaving" value="false" /> 
      <entry key="eclipselink.logging.level" value="WARNING" /> 
      <entry key="eclipselink.logging.timestamp" value="false" /> 
      <entry key="eclipselink.logging.session" value="false" /> 
      <entry key="eclipselink.logging.thread" value="false" /> 
     </map> 
    </property> 
    <property name="loadTimeWeaver"> 
     <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" /> 
    </property> 
</bean> 

<bean id="emf2" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource2" /> 
    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence2.xml" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter"> 
      <property name="showSql" value="false" /> 
     </bean> 
    </property> 
    <property name="jpaPropertyMap"> 
     <map> 
      <entry key="eclipselink.weaving" value="false" /> 
      <entry key="eclipselink.logging.level" value="WARNING" /> 
      <entry key="eclipselink.logging.timestamp" value="false" /> 
      <entry key="eclipselink.logging.session" value="false" /> 
      <entry key="eclipselink.logging.thread" value="false" /> 
     </map> 
    </property> 
    <property name="loadTimeWeaver"> 
     <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" /> 
    </property> 
</bean> 

<bean name="transaction1" class="org.springframework.orm.jpa.JpaTransactionManager" p:entity-manager-factory-ref="emf1" /> 
<bean name="transaction2" class="org.springframework.orm.jpa.JpaTransactionManager" p:entity-manager-factory-ref="emf2" /> 

<jpa:repositories base-package="org.myproject.repository1" transaction-manager-ref="transaction1" entity-manager-factory-ref="emf1" /> 
<jpa:repositories base-package="org.myproject.repository2" transaction-manager-ref="transaction2" entity-manager-factory-ref="emf2" /> 

<tx:annotation-driven /> 

persistence1.xml

<persistence-unit name="persistence1" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
    <class>org.myproject.repository1.Repo1</class> 
    <class>org.myproject.repository1.Repo2</class> 
    <exclude-unlisted-classes>true</exclude-unlisted-classes> 
</persistence-unit> 

persistence2.xml

<persistence-unit name="persistence2" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
    <class>org.myproject.repository2.Repo1</class> 
    <class>org.myproject.repository2.Repo2</class> 
    <exclude-unlisted-classes>true</exclude-unlisted-classes> 
</persistence-unit> 

Vì vậy, điều này làm việc cho tôi ...

Rõ ràng quy định cụ thể từng "persistence.xml" vị trí ngăn chặn các lớp học có nghĩa là cho EntityManagerFactory khác để được khởi tạo vào "emf" đầu tiên. Trong thực tế, điều này trông giống như một lỗi https://bugs.eclipse.org/bugs/show_bug.cgi?id=338837. Tất cả tôi có thể tìm ra từ gỡ lỗi của tôi là không có "persistenceXmlLocation" TẤT CẢ các lớp được tìm thấy với "packageScan" được khởi tạo trên "emf" được tạo đầu tiên, "emf" thứ hai hoàn toàn bị bỏ qua.

Hy vọng điều này sẽ hữu ích. Chúc may mắn!

0

Thêm gói (com.acme.domain.entities) với các đối tượng vào packagesToScan.

0

Đặt PersistenceUnitName, thay vì persistenceXmlLocation

Không persistence.xml cần thiết.

factory.setPersistenceUnitName("dummy1"); 
factory.setPersistenceUnitName("dummy2"); 
Các vấn đề liên quan