A component required a bean named'entityManagerFactory'that could not be found.に質問

3342 ワード

に質問


SpringBootがマルチデータソースを統合するプロジェクトをデバッグ中に、例外が起動します.エラーは次のとおりです.
***************************
APPLICATION FAILED TO START
***************************

Description:

A component required a bean named 'entityManagerFactory' that could not be found.


Action:

Consider defining a bean named 'entityManagerFactory' in your configuration.

 

ぶんせき


ネット上でこのような問題が発生した原因を統計しました.
【原因1】jarパッケージの競合https://blog.csdn.net/babyyaoyao/article/details/81132016この文はpomにあるからです.xmlファイルではspring-boot-starter-data-jpaで2.0.3が指定する.RELEASEにより,このversionを削除すればよいという解決策が得られる.
                     org.springframework.boot             spring-boot-starter-data-jpa             2.0.3.RELEASE                  
その解釈に異常が発生した原因はhibernateのjarパケットと衝突した可能性がある.【原因2】jarパッケージ破損1)helsonxiao commented on 28 Mar 2018 I had the same error.After deleting all repos under .m2 folder and redownloading. It works.
2)HSamiSari answered Jul 12  2018
I had exact same issue. When I checked maven build log I have realised that there was an error about hibernate packages complaining about "invalid LOC header (bad signature)". I solved by deleting sub directories under .m2\repository\org\hibernate\hibernate-core and recompiling my project. 解決策は、破損したjarを削除し、再ロードすることです.
 
以上の2つの解決策を試したことがありますが、問題はまだ解決されていません.私の問題が別の状況であることを説明します.
後でコードをよく研究して、コードを調整してみて、やっと原因を見つけました.
DBConfig 1.JAvaファイルで誤ったデータソースの構成方法:
    …… 

    private DataSource dataSource1;

	/**
	 * @methodDesc:  :( )
	 */
	@Bean(name = "dataSource1")
	@ConfigurationProperties(prefix = "mysql.datasource.test1")
	public DataSource createDataSource() {
		dataSource1 = DataSourceBuilder.create().build();
		return dataSource1;
	}

	……

	@Primary
	@Bean(name = "entityManagerFactory1")
	public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder) {
		if(dataSource1 == null) {
			createDataSource();
		}
		return builder.dataSource(dataSource1).properties(getVendorProperties())
				.packages("com.example.demo.entity") //  
				.persistenceUnit("primaryPersistenceUnit").build();
	}

 

解決する


データソースを1つの構成クラスに独立するDataSourceConfigに注入する.JAva:
    @Bean(name = "dataSource1")
    @Qualifier("dataSource1")
    @Primary
    @ConfigurationProperties(prefix="mysql.datasource.test1")
    public DataSource dataSource1() {
        return DataSourceBuilder.create().build();
    }

別のプロファイルDBConfig 1.JAvaでは、このデータソースを使用します.
     @Autowired 
	@Qualifier("dataSource1")
	private DataSource dataSource1;

	@Primary
	@Bean(name = "entityManager1")
	public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
		return entityManagerFactory(builder).getObject().createEntityManager();
	}

	@Primary
	@Bean(name = "entityManagerFactory1")
	public LocalContainerEntityManagerFactoryBean       entityManagerFactory(EntityManagerFactoryBuilder builder) {
		return builder.dataSource(dataSource1).properties(getVendorProperties())
				.packages("com.example.demo.entity") //  
				.persistenceUnit("primaryPersistenceUnit").build();
	}

問題が解決した.
文章が終わる.