在将spring-cloud-context jar导入spring-boot2项目后,它无法解析数据源bean“ org.apache.tomcat.jdbc.pool.DataSource”配置中的属性placeHolder。但是成功解析了其他bean配置中的相同属性placeHolder。
其他数据源bean(例如“ com.alibaba.druid.pool.DruidDataSource”)也有相同的问题。 spring-cloud-context中哪个配置类如此急切地导致spring load数据源bean?
<bean id="dataSourceTarget" class="org.apache.tomcat.jdbc.pool.DataSource"
destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="${mysql.url}" />
<property name="username" value="${mysql.username}" />
<property name="password" value="${mysql.password}" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="true" />
<property name="testOnReturn" value="false" />
<property name="validationInterval" value="60000" />
<property name="validationQuery" value="select 1 from dual" />
<property name="maxActive" value="100" />
<property name="minIdle" value="1" />
</bean>
<bean id="configTest1" class="wzp.rest.service.ConfigTest"
primary="true">
<property name="password" value="${mysql.password}" />
</bean>
pom.xml:
<!-- feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.4.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-archaius</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-archaius</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-ribbon</artifactId>
</exclusion>
<exclusion>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-hystrix</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
答案 0 :(得分:0)
我使用mybatis的MapperFactoryBean来加载映射器,并且MapperFactoryBean早于PropertyPlacesPlaceholderConfigurer更改占位符时加载sqlSessionFactory和数据源Bean。
当我使用org.mybatis.spring.mapper.MapperScannerConfigurer加载映射器时,问题消失了。
@ConditionalOnMissingBean使所有工厂bean及其相关的bean尽早初始化,并在解析其定义中的占位符之前调用其getObjectType函数。然后,spring-cloud-context jar中的spring cloud config客户端使普通的PropertySourcesPlaceholderConfigurer无法解析和更新这些bean的占位符。可以通过设置哪些人不使用云配置来禁止此行为:
spring.cloud.config.enabled=false
spring.cloud.refresh.enabled=false