This is an automated email from the ASF dual-hosted git repository.

zhangliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 1bdabc6  fix spring boot 2.x reads an environment variable exception ! 
(#8329)
1bdabc6 is described below

commit 1bdabc640636ad23682baa373847a3f55aa2d2c6
Author: xiaoyu <[email protected]>
AuthorDate: Wed Nov 25 12:52:58 2020 +0800

    fix spring boot 2.x reads an environment variable exception ! (#8329)
---
 .../boot/datasource/DataSourceMapSetter.java       | 31 +++++++++++-----------
 .../AbstractAlgorithmProvidedBeanRegistry.java     | 31 +++++++++++++++-------
 2 files changed, 36 insertions(+), 26 deletions(-)

diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-spring-infra/shardingsphere-jdbc-spring-boot-starter-infra/src/main/java/org/apache/shardingsphere/spring/boot/datasource/DataSourceMapSetter.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-spring-infra/shardingsphere-jdbc-spring-boot-starter-infra/src/main/java/org/apache/shardingsphere/spring/boot/datasource/DataSourceMapSetter.java
index fdf57b0..a954209 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-spring-infra/shardingsphere-jdbc-spring-boot-starter-infra/src/main/java/org/apache/shardingsphere/spring/boot/datasource/DataSourceMapSetter.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-spring-infra/shardingsphere-jdbc-spring-boot-starter-infra/src/main/java/org/apache/shardingsphere/spring/boot/datasource/DataSourceMapSetter.java
@@ -60,13 +60,11 @@ public final class DataSourceMapSetter {
      * @param environment spring boot environment
      * @return data source map
      */
-    @SuppressWarnings("unchecked")
     public static Map<String, DataSource> getDataSourceMap(final Environment 
environment) {
         Map<String, DataSource> result = new LinkedHashMap<>();
-        Map<String, Object> dataSourceCommonProps = 
PropertyUtil.handle(environment, COMMON_PREFIX, Map.class);
-        for (String each : getDataSourceNames(environment, PREFIX)) {
+        for (String each : getDataSourceNames(environment)) {
             try {
-                result.put(each, getDataSource(environment, PREFIX, each, 
dataSourceCommonProps));
+                result.put(each, getDataSource(environment, each));
             } catch (final ReflectiveOperationException ex) {
                 throw new ShardingSphereException("Can't find data source 
type.", ex);
             } catch (final NamingException ex) {
@@ -76,37 +74,38 @@ public final class DataSourceMapSetter {
         return result;
     }
     
-    private static List<String> getDataSourceNames(final Environment 
environment, final String prefix) {
+    private static List<String> getDataSourceNames(final Environment 
environment) {
         StandardEnvironment standardEnv = (StandardEnvironment) environment;
         standardEnv.setIgnoreUnresolvableNestedPlaceholders(true);
-        String dataSourceNames = standardEnv.getProperty(prefix + 
DATA_SOURCE_NAME);
+        String dataSourceNames = standardEnv.getProperty(PREFIX + 
DATA_SOURCE_NAME);
         if (StringUtils.isEmpty(dataSourceNames)) {
-            dataSourceNames = standardEnv.getProperty(prefix + 
DATA_SOURCE_NAMES);
+            dataSourceNames = standardEnv.getProperty(PREFIX + 
DATA_SOURCE_NAMES);
         }
         return new InlineExpressionParser(dataSourceNames).splitAndEvaluate();
     }
     
-    @SuppressWarnings("unchecked")
-    private static DataSource getDataSource(final Environment environment, 
final String prefix, final String dataSourceName,
-                                            final Map<String, Object> 
dataSourceCommonProps) throws ReflectiveOperationException, NamingException {
-        Map<String, Object> dataSourceProps = 
mergedDataSourceProps(PropertyUtil.handle(environment, prefix + 
dataSourceName.trim(), Map.class), dataSourceCommonProps);
+    private static DataSource getDataSource(final Environment environment, 
final String dataSourceName) throws ReflectiveOperationException, 
NamingException {
+        Map<String, Object> dataSourceProps = mergedDataSourceProps(PREFIX + 
dataSourceName.trim(), environment);
         Preconditions.checkState(!dataSourceProps.isEmpty(), 
String.format("Wrong datasource [%s] properties.", dataSourceName));
         if (dataSourceProps.containsKey(JNDI_NAME)) {
             return 
getJNDIDataSource(dataSourceProps.get(JNDI_NAME).toString());
         }
         DataSource result = 
DataSourceUtil.getDataSource(dataSourceProps.get(DATA_SOURCE_TYPE).toString(), 
dataSourceProps);
         
DataSourcePropertiesSetterHolder.getDataSourcePropertiesSetterByType(dataSourceProps.get(DATA_SOURCE_TYPE).toString()).ifPresent(
-            propsSetter -> propsSetter.propertiesSet(environment, prefix, 
dataSourceName, result));
+            propsSetter -> propsSetter.propertiesSet(environment, PREFIX, 
dataSourceName, result));
         return result;
     }
     
-    private static Map<String, Object> mergedDataSourceProps(final Map<String, 
Object> dataSourceProps, final Map<String, Object> dataSourceCommonProps) {
-        if (!dataSourceCommonProps.isEmpty()) {
+    @SuppressWarnings("unchecked")
+    private static Map<String, Object> mergedDataSourceProps(final String 
prefix, final Environment environment) {
+        final Map<String, Object> dataSourceProps = 
PropertyUtil.handle(environment, prefix, Map.class);
+        boolean exist = PropertyUtil.containPropertyPrefix(environment, 
COMMON_PREFIX);
+        if (exist) {
+            Map<String, Object> dataSourceCommonProps = 
PropertyUtil.handle(environment, COMMON_PREFIX, Map.class);
             dataSourceCommonProps.putAll(dataSourceProps);
             return dataSourceCommonProps;
-        } else {
-            return dataSourceProps;
         }
+        return dataSourceProps;
     }
     
     private static DataSource getJNDIDataSource(final String jndiName) throws 
NamingException {
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-spring-infra/shardingsphere-jdbc-spring-boot-starter-infra/src/main/java/org/apache/shardingsphere/spring/boot/registry/AbstractAlgorithmProvidedBeanRegistry.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-spring-infra/shardingsphere-jdbc-spring-boot-starter-infra/src/main/java/org/apache/shardingsphere/spring/boot/registry/AbstractAlgorithmProvidedBeanRegistry.java
index 7f47006..089e37c 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-spring-infra/shardingsphere-jdbc-spring-boot-starter-infra/src/main/java/org/apache/shardingsphere/spring/boot/registry/AbstractAlgorithmProvidedBeanRegistry.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-spring-infra/shardingsphere-jdbc-spring-boot-starter-infra/src/main/java/org/apache/shardingsphere/spring/boot/registry/AbstractAlgorithmProvidedBeanRegistry.java
@@ -43,29 +43,40 @@ import java.util.stream.Collectors;
 @RequiredArgsConstructor(access = AccessLevel.PROTECTED)
 public abstract class AbstractAlgorithmProvidedBeanRegistry<T extends 
ShardingSphereAlgorithm> implements BeanDefinitionRegistryPostProcessor, 
BeanPostProcessor {
     
+    private static final String TYPE_SUFFIX = ".type";
+    
+    private static final String PROPS_SUFFIX = ".props";
+    
+    private static final String PROPS = "props";
+    
     private final Environment environment;
     
     @SuppressWarnings("all")
-    protected void registerBean(final String preFix, final Class<T> 
algorithmClass, final BeanDefinitionRegistry registry) {
-        Map<String, Object> paramMap = PropertyUtil.handle(environment, 
preFix, Map.class);
+    protected void registerBean(final String prefix, final Class<T> 
algorithmClass, final BeanDefinitionRegistry registry) {
+        Map<String, Object> paramMap = PropertyUtil.handle(environment, 
prefix, Map.class);
         Set<String> keys = paramMap.keySet().stream().map(key -> {
             return key.contains(".") ? key.substring(0, key.indexOf(".")) : 
key;
         }).collect(Collectors.toSet());
         Map<String, YamlShardingSphereAlgorithmConfiguration> 
shardingAlgorithmMap = new LinkedHashMap<>();
         keys.forEach(each -> {
-            String type = environment.getProperty(preFix + each + ".type");
-            Map<String, Object> propsMap = PropertyUtil.handle(environment, 
preFix + each + ".props", Map.class);
             YamlShardingSphereAlgorithmConfiguration config = new 
YamlShardingSphereAlgorithmConfiguration();
-            config.setType(type);
-            config.getProps().putAll(propsMap);
+            String propsPrefix = String.join("", prefix, each, PROPS_SUFFIX);
+            boolean exist = PropertyUtil.containPropertyPrefix(environment, 
propsPrefix);
+            if (exist) {
+                Map<String, Object> propsMap = 
PropertyUtil.handle(environment, propsPrefix, Map.class);
+                config.getProps().putAll(propsMap);
+            }
+            String typePrefix = String.join("", prefix, each, TYPE_SUFFIX);
+            String algorithmType = environment.getProperty(typePrefix);
+            config.setType(algorithmType);
             shardingAlgorithmMap.put(each, config);
         });
         ShardingSphereServiceLoader.register(algorithmClass);
-        shardingAlgorithmMap.forEach((k, v) -> {
-            ShardingSphereAlgorithm algorithm = 
TypedSPIRegistry.getRegisteredService(algorithmClass, v.getType(), 
v.getProps());
+        shardingAlgorithmMap.forEach((key, algorithmConfiguration) -> {
+            ShardingSphereAlgorithm algorithm = 
TypedSPIRegistry.getRegisteredService(algorithmClass, 
algorithmConfiguration.getType(), algorithmConfiguration.getProps());
             BeanDefinitionBuilder builder = 
BeanDefinitionBuilder.genericBeanDefinition(algorithm.getClass());
-            builder.addPropertyValue("props", v.getProps());
-            registry.registerBeanDefinition(k, builder.getBeanDefinition());
+            builder.addPropertyValue(PROPS, algorithmConfiguration.getProps());
+            registry.registerBeanDefinition(key, builder.getBeanDefinition());
         });
     }
     

Reply via email to