2017-10-05 9 views
0

2つのデータソースを持つSpringブートプロジェクトがあります。まず、このプロジェクトのエンティティを使用します。別のプロジェクトの依存関係としてインポートされたJPAエンティティを使用する2番目のデータソースが必要です。私はthis exampleを使って2つのデータソースを作成しました。しかし、私はエラーのためにプロジェクトを実行することはできません:私は、インポートするエンティティのための構成を以下しているインポートされたエンティティを使用しているときのJpaTransactionManagerのエラー

org.springframework.beans.factory.UnsatisfiedDependencyException: 
Error creating bean with name '(inner bean)#69ebb490': 
Unsatisfied dependency expressed through method 'createSharedEntityManager' parameter 0: Could not convert argument value of type [org.springframework.orm.jpa.JpaTransactionManager] to required type [javax.persistence.EntityManagerFactory]: 
Failed to convert value of type 'org.springframework.orm.jpa.JpaTransactionManager' to required type 'javax.persistence.EntityManagerFactory'; nested exception is java.lang.IllegalStateException: 
Cannot convert value of type 'org.springframework.orm.jpa.JpaTransactionManager' to required type 'javax.persistence.EntityManagerFactory': no matching editors or conversion strategy found 

を(私が置か輸入エンティティとして私のアプリで同じパッケージに私のサービスを置くために、同じパッケージ構造を作成):

インポートされたエンティティの
import com.company.second.db.entities.MyImportedEntity; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; 
import org.springframework.boot.context.properties.ConfigurationProperties; 
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.data.jpa.repository.config.EnableJpaRepositories; 
import org.springframework.orm.jpa.JpaTransactionManager; 
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; 
import org.springframework.transaction.PlatformTransactionManager; 
import org.springframework.transaction.annotation.EnableTransactionManagement; 

import javax.persistence.EntityManagerFactory; 
import javax.sql.DataSource; 
import java.util.HashMap; 
import java.util.Map; 

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories(
    basePackages = {"com.company.second.db", "com.company.second.db.entities"}, 
    entityManagerFactoryRef = "secondTransactionManager", 
    transactionManagerRef = "secondEntityManagerFactory" 
) 
public class SecondDataSourceConfig { 

    @Bean(name = "secondDataSource") 
    @ConfigurationProperties(prefix = "second.datasource") 
    public DataSource dataSource() { 
     return DataSourceBuilder.create().build(); 
    } 

    @Bean(name = "secondEntityManagerFactory") 
    public LocalContainerEntityManagerFactoryBean secondEntityManagerFactory(
     EntityManagerFactoryBuilder builder, @Qualifier("secondDataSource") DataSource dataSource) { 
    final Map<String, String> properties = new HashMap<>(); 
    properties.put("hibernate.archive.autodetection", "class, hbm"); 
    return builder.dataSource(dataSource) 
      .packages("com.company.second.db", "com.company.second.db.entities") 
      .properties(properties).packages(MyImportedEntity.class) 
      .persistenceUnit("second") 
      .build(); 
} 

@Bean(name = "secondTransactionManager") 
public PlatformTransactionManager SecondTransactionManager(
     @Qualifier("secondEntityManagerFactory") EntityManagerFactory secondEntityManagerFactory) { 
    return new JpaTransactionManager(secondEntityManagerFactory); 
} 

} 

例:

package com.company.second.db.entities; 

import com.fasterxml.jackson.annotation.JsonIgnore; 
import com.fasterxml.jackson.annotation.JsonProperty; 
import lombok.Data; 
import org.apache.commons.lang3.builder.ToStringBuilder; 

import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.ForeignKey; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 
import javax.validation.constraints.NotNull; 
import java.util.List; 

@Data 
@Entity 
@Table(name = "my_imported_entity") 
public class MyImportedEntity {...} 

はまた、私はこの輸入エンティティで動作するようにサービスを設定しよう:

package com.company.second.db.service.impl; 

import com.company.second.db.entities.MyImportedEntity; 
import com.company.second.db.entities.repository.MyImportedEntityRepository; 
import com.company.second.db.service.MyImportedEntityService; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.data.domain.Page; 
import org.springframework.data.domain.PageRequest; 
import org.springframework.stereotype.Service; 
import org.springframework.transaction.annotation.Propagation; 
import org.springframework.transaction.annotation.Transactional; 

import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 

@Service 
@Transactional(value = "secondTransactionManager", readOnly = true, propagation = Propagation.REQUIRED) 
public class MyImportedEntityServiceImpl implements MyImportedEntityService { ... } 

私は二次設定と同じですが、@Primaryの注釈を使用しています。そして、このエラーがなければ正常に動作します:

Cannot convert value of type 'org.springframework.orm.jpa.JpaTransactionManager' to required type 'javax.persistence.EntityManagerFactory': no matching editors or conversion strategy found 

どうすればこの問題を解決できますか?

答えて

0

はこちらをご覧ください:

entityManagerFactoryRef = "secondTransactionManager", 
transactionManagerRef = "secondEntityManagerFactory" 

に見えますが、豆間違った方向に置かれているように、それは次のようになります。

entityManagerFactoryRef = "secondEntityManagerFactory", 
transactionManagerRef = "secondTransactionManager" 

だその理由にSpring試行:convert value of type 'org.springframework.orm.jpa.JpaTransactionManager' to required type 'javax.persistence.EntityManagerFactory'

+0

:手のひらを顔に当てます: ありがとうございました! –

関連する問題