Spring Boot的子項目Spring data JPA配置多數據源的那些坑兒

Spring Boot 的spring data JPA配置多數據源項目過程分析:

工程結構:

左側為工程結構

POM.xml

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>2.0.4.RELEASE</version>

第一個坑兒:

實體管理器和事務管理器配置中:

修改

/*? ? private Map?getVendorProperties(DataSource dataSource) {

return jpaProperties.getHibernateProperties(dataSource);

? ? }*/

private Map getVendorProperties() {

return jpaProperties.getHibernateProperties(new HibernateSettings());

}

原因:javax.sql.DataSource 不能作為?jpaProperties.getHibernateProperties的參數。

如果你Spring Boot 框架使用1.5.6版本也會報錯,

@Autowired

private JpaProperties ?jpaProperties;

報錯說:找不到這個Bean.


第二個坑兒:

at com.potevio.platform.PlatformApplication.main(PlatformApplication.java:10) [classes/:na]

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'entityManagerFactoryBuilder' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Unsatisfied dependency expressed through method 'entityManagerFactoryBuilder' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaVendorAdapter' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.orm.jpa.JpaVendorAdapter]: Factory method 'jpaVendorAdapter' threw exception; nested exception is java.lang.IllegalArgumentException: dataSource or dataSourceClassName or jdbcUrl is required.

百度、goolge了好久:

說什么的都有:1、有人說導入的jar包不對;

2、有人說是因為缺少Herbinate相關的jar包;

我在POM文件中加入:

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-jdbc</artifactId>

<version>5.1.1.RELEASE</version>

</dependency>

然后,錯誤變成了:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'entityManagerFactoryHeatMap' defined in class path resource [com/potevio/platform/config/RepositoryHeatMapConfig.class]: Unsatisfied dependency expressed through method 'entityManagerFactoryHeatMap' parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'entityManagerFactoryBuilder' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Unsatisfied dependency expressed through method 'entityManagerFactoryBuilder' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaVendorAdapter' defined in class path resource

可見,引入spring-jdbc是對的,但是還是有些地方不對。

繼續找原因:

把有問題的源碼貼出來看看:

package com.potevio.platform.config;

/**

* @program: platform

* @description: 實體管理器和事務管理器配置

* @author: fengzhenbiao

* @create: 2018-11-28 15:32

**/

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;

import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;

import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.Primary;

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.EntityManager;

import javax.sql.DataSource;

import java.util.Map;

@Configuration

@EnableTransactionManagement

@EnableJpaRepositories(

/*實體管理工廠引用名稱,對應到@Bean注解對應的方法*/

? ? ? ? entityManagerFactoryRef="entityManagerFactoryHeatMap",

/*事務管理工廠引用名稱,對應到@Bean注解對應的方法*/

? ? ? ? transactionManagerRef="transactionManagerHeatMap",

basePackages= {"com.potevio.platform.repository.heatMapRepository" }

)

public class RepositoryHeatMapConfig {

@Autowired

? ? private JpaPropertiesjpaProperties;

@Autowired

? ? @Qualifier("heatMapDS")

private DataSourceheatMapDS;

@Bean(name ="entityManagerHeatMap")

@Primary

? ? public EntityManager entityManager(EntityManagerFactoryBuilder builder) {

return entityManagerFactoryHeatMap(builder).getObject().createEntityManager();

}

@Bean(name ="entityManagerFactoryHeatMap")

@Primary

? ? public LocalContainerEntityManagerFactoryBean entityManagerFactoryHeatMap (EntityManagerFactoryBuilder builder) {

return builder

.dataSource(heatMapDS)

.properties(getVendorProperties())

.packages("com.potevio.platform.domain.heatMapDomain")//設置實體類所在位置

? ? ? ? ? ? ? ? .persistenceUnit("primaryPersistenceUnit")

.build();

}

private Map getVendorProperties() {

return jpaProperties.getHibernateProperties(new HibernateSettings());

}

/*? ? private Map getVendorProperties(DataSource dataSource) {

return jpaProperties.getHibernateProperties(dataSource);

}*/

? ? @Bean(name ="transactionManagerHeatMap")

@Primary

? ? PlatformTransactionManager transactionManagerHeatMap(EntityManagerFactoryBuilder builder) {

return new JpaTransactionManager(entityManagerFactoryHeatMap(builder).getObject());

}

}

Log記錄錯誤從這里開始:

?public LocalContainerEntityManagerFactoryBean entityManagerFactoryHeatMap (EntityManagerFactoryBuilder builder)?

繼續往下看log

Unsatisfied dependency expressed through method 'entityManagerFactoryBuilder' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaVendorAdapter' defined in class path resource

錯誤發生的地方進一步鎖定在?'entityManagerFactoryBuilder' ,它的第一個參數是什么呢?

看看庫里的源碼:

//

// Source code recreated from a .class file by IntelliJ IDEA

// (powered by Fernflower decompiler)

//

package org.springframework.boot.orm.jpa;

import java.net.URL;

import java.util.HashMap;

import java.util.HashSet;

import java.util.LinkedHashMap;

import java.util.Map;

import java.util.Set;

import javax.sql.DataSource;

import org.springframework.orm.jpa.JpaVendorAdapter;

import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;

import org.springframework.orm.jpa.persistenceunit.PersistenceUnitManager;

import org.springframework.util.ClassUtils;

import org.springframework.util.ObjectUtils;

import org.springframework.util.StringUtils;

public class EntityManagerFactoryBuilder {

private final JpaVendorAdapter jpaVendorAdapter;

private final PersistenceUnitManager persistenceUnitManager;

private final Map jpaProperties;

private final URL persistenceUnitRootLocation;

private EntityManagerFactoryBuilder.EntityManagerFactoryBeanCallback callback;

public EntityManagerFactoryBuilder(JpaVendorAdapter jpaVendorAdapter, Map jpaProperties, PersistenceUnitManager persistenceUnitManager) {

this(jpaVendorAdapter, jpaProperties, persistenceUnitManager, (URL)null);

}

public EntityManagerFactoryBuilder(JpaVendorAdapter jpaVendorAdapter, Map jpaProperties, PersistenceUnitManager persistenceUnitManager, URL persistenceUnitRootLocation) {

this.jpaVendorAdapter = jpaVendorAdapter;

this.persistenceUnitManager = persistenceUnitManager;

this.jpaProperties =new LinkedHashMap(jpaProperties);

this.persistenceUnitRootLocation = persistenceUnitRootLocation;

}

public EntityManagerFactoryBuilder.Builder dataSource(DataSource dataSource) {

return new EntityManagerFactoryBuilder.Builder(dataSource);

}

public void setCallback(EntityManagerFactoryBuilder.EntityManagerFactoryBeanCallback callback) {

this.callback = callback;

}

@FunctionalInterface

public interface EntityManagerFactoryBeanCallback {

void execute(LocalContainerEntityManagerFactoryBean factory);

}

public final class Builder {

private DataSource dataSource;

private String[] packagesToScan;

private String persistenceUnit;

private Map properties;

private String[] mappingResources;

private boolean jta;

private Builder(DataSource dataSource) {

this.properties =new HashMap();

this.dataSource = dataSource;

}

public EntityManagerFactoryBuilder.Builder packages(String... packagesToScan) {

this.packagesToScan = packagesToScan;

return this;

}

public EntityManagerFactoryBuilder.Builder packages(Class... basePackageClasses) {

Set packages =new HashSet();

Class[] var3 = basePackageClasses;

int var4 = basePackageClasses.length;

for(int var5 =0; var5 < var4; ++var5) {

Class type = var3[var5];

packages.add(ClassUtils.getPackageName(type));

}

this.packagesToScan = StringUtils.toStringArray(packages);

return this;

}

public EntityManagerFactoryBuilder.Builder persistenceUnit(String persistenceUnit) {

this.persistenceUnit = persistenceUnit;

return this;

}

public EntityManagerFactoryBuilder.Builder properties(Map properties) {

this.properties.putAll(properties);

return this;

}

public EntityManagerFactoryBuilder.Builder mappingResources(String... mappingResources) {

this.mappingResources = mappingResources;

return this;

}

public EntityManagerFactoryBuilder.Builder jta(boolean jta) {

this.jta = jta;

return this;

}

public LocalContainerEntityManagerFactoryBean build() {

LocalContainerEntityManagerFactoryBean entityManagerFactoryBean =new LocalContainerEntityManagerFactoryBean();

if (EntityManagerFactoryBuilder.this.persistenceUnitManager !=null) {

entityManagerFactoryBean.setPersistenceUnitManager(EntityManagerFactoryBuilder.this.persistenceUnitManager);

}

if (this.persistenceUnit !=null) {

entityManagerFactoryBean.setPersistenceUnitName(this.persistenceUnit);

}

entityManagerFactoryBean.setJpaVendorAdapter(EntityManagerFactoryBuilder.this.jpaVendorAdapter);

if (this.jta) {

entityManagerFactoryBean.setJtaDataSource(this.dataSource);

}else {

entityManagerFactoryBean.setDataSource(this.dataSource);

}

entityManagerFactoryBean.setPackagesToScan(this.packagesToScan);

entityManagerFactoryBean.getJpaPropertyMap().putAll(EntityManagerFactoryBuilder.this.jpaProperties);

entityManagerFactoryBean.getJpaPropertyMap().putAll(this.properties);

if (!ObjectUtils.isEmpty(this.mappingResources)) {

entityManagerFactoryBean.setMappingResources(this.mappingResources);

}

URL rootLocation = EntityManagerFactoryBuilder.this.persistenceUnitRootLocation;

if (rootLocation !=null) {

entityManagerFactoryBean.setPersistenceUnitRootLocation(rootLocation.toString());

}

if (EntityManagerFactoryBuilder.this.callback !=null) {

EntityManagerFactoryBuilder.this.callback.execute(entityManagerFactoryBean);

}

return entityManagerFactoryBean;

}

}

}


應該是缺少一個Baen ? ?jpaVendorAdapter

@Bean

@Primary

public JpaVendorAdapter jpaVendorAdapter() {

HibernateJpaVendorAdapter adapter =new HibernateJpaVendorAdapter();

adapter.setDatabase(Database.MYSQL);

adapter.setShowSql(false);

adapter.setGenerateDdl(true);

adapter.setDatabasePlatform("org.hibernate.dialect.MySQL5Dialect");

return adapter;

}


由接近真相了

注意要修改配置文件中的url---->jdbc-url


一個大神的經驗

然后:


攔截器報錯

考慮配置有問題:


修改

修改:去掉@Primary

成功!


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,443評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,530評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,407評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,981評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,759評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,204評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,263評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,415評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,955評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,650評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,892評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,675評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,967評論 2 374

推薦閱讀更多精彩內容