ShayneLin opened a new issue, #28742:
URL: https://github.com/apache/shardingsphere/issues/28742

   
   I use shardingsphere-jdbc-core 5.4.0.
   
   In order to encrypt the database password into ciphertext, HikariDataSource 
is inherited and getPassword() is rewritten.As follows:
   ```
   package net.netca.demo.framework.datasource.config;
   
   import com.zaxxer.hikari.HikariDataSource;
   import lombok.extern.slf4j.Slf4j;
   import net.netca.demo.framework.common.util.EncAndDecryptUtil;
   import org.apache.commons.lang3.StringUtils;
   
   @Slf4j
   public class DecryptDataSource extends HikariDataSource {
       @Override
       public String getPassword() {
           String password = super.getPassword();
           if (StringUtils.isBlank(password)) {
               return null;
           }
           try{
               return EncAndDecryptUtil.decrypt(password);
           }catch (Exception e){
               log.warn("数据库密码解密失败,采用原密码。");
               return password;
           }
       }
   
   
   }
   ```
   
   My springboot for shardingsphere in the application-sharding.yml file as 
follows:
   ```
   mode:
     type: Standalone
     repository:
       type: JDBC
   dataSources:
     # 分片数据源
     ds0:
       dataSourceClassName: 
net.netca.demo.framework.datasource.config.DecryptDataSource
       driverClassName: com.mysql.cj.jdbc.Driver
       jdbcUrl: 
jdbc:mysql://ip:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&autoReconnect=true&failOverReadOnly=false&useSSL=false&zeroDateTimeBehavior=CONVERT_TO_NULL&allowPublicKeyRetrieval=true
       username: root
       password: 882fdd5dc817460f677645a545aaaa5df08d56b3d4766a04
       connectionTimeoutMilliseconds: 30000
       idleTimeoutMilliseconds: 60000
       maxLifetimeMilliseconds: 1800000
       maxPoolSize: 50
       minPoolSize: 1
   
   rules:
   # 定义需要被shardingjdbc管理的单表
   - !SINGLE
     tables:
       - ds0.*
     defaultDataSource: ds0
   ```
   application.yaml
   ```
   spring:
     # 上传文件配置
     servlet:
       multipart:
         max-file-size: 10MB
         max-request-size: 10MB
   
     # 数据库连接配置
     datasource:
       driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver
       url: jdbc:shardingsphere:classpath:application-sharding.yml
   ```
   
   But,meet some problem,like that:
   ```
   2023-10-12 21:24:33.106  INFO 26300 --- [           main] 
com.zaxxer.hikari.HikariDataSource       : HikariPool-3 - Start completed.
   2023-10-12 21:24:35.315 ERROR 26300 --- [           main] 
com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Exception during pool 
initialization.
   
   java.lang.NullPointerException: null
        at 
org.apache.shardingsphere.infra.metadata.database.resource.ShardingSphereResourceMetaData.createDataSourceMetaDataMap(ShardingSphereResourceMetaData.java:79)
 ~[shardingsphere-infra-common-5.4.0.jar:5.4.0]
        at 
org.apache.shardingsphere.infra.metadata.database.resource.ShardingSphereResourceMetaData.<init>(ShardingSphereResourceMetaData.java:55)
 ~[shardingsphere-infra-common-5.4.0.jar:5.4.0]
        at 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase.createResourceMetaData(ShardingSphereDatabase.java:126)
 ~[shardingsphere-infra-common-5.4.0.jar:5.4.0]
        at 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase.create(ShardingSphereDatabase.java:120)
 ~[shardingsphere-infra-common-5.4.0.jar:5.4.0]
        at 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase.create(ShardingSphereDatabase.java:92)
 ~[shardingsphere-infra-common-5.4.0.jar:5.4.0]
        at 
org.apache.shardingsphere.metadata.factory.ExternalMetaDataFactory.createGenericDatabases(ExternalMetaDataFactory.java:84)
 ~[shardingsphere-metadata-core-5.4.0.jar:5.4.0]
        at 
org.apache.shardingsphere.metadata.factory.ExternalMetaDataFactory.create(ExternalMetaDataFactory.java:71)
 ~[shardingsphere-metadata-core-5.4.0.jar:5.4.0]
        at 
org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory.create(MetaDataContextsFactory.java:95)
 ~[shardingsphere-mode-core-5.4.0.jar:5.4.0]
        at 
org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory.create(MetaDataContextsFactory.java:69)
 ~[shardingsphere-mode-core-5.4.0.jar:5.4.0]
        at 
org.apache.shardingsphere.mode.manager.standalone.StandaloneContextManagerBuilder.build(StandaloneContextManagerBuilder.java:52)
 ~[shardingsphere-standalone-mode-core-5.4.0.jar:5.4.0]
        at 
org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource.createContextManager(ShardingSphereDataSource.java:82)
 ~[shardingsphere-jdbc-core-5.4.0.jar:5.4.0]
        at 
org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource.<init>(ShardingSphereDataSource.java:69)
 ~[shardingsphere-jdbc-core-5.4.0.jar:5.4.0]
        at 
org.apache.shardingsphere.driver.api.ShardingSphereDataSourceFactory.createDataSource(ShardingSphereDataSourceFactory.java:95)
 ~[shardingsphere-jdbc-core-5.4.0.jar:5.4.0]
        at 
org.apache.shardingsphere.driver.api.yaml.YamlShardingSphereDataSourceFactory.createDataSource(YamlShardingSphereDataSourceFactory.java:167)
 ~[shardingsphere-jdbc-core-5.4.0.jar:5.4.0]
        at 
org.apache.shardingsphere.driver.api.yaml.YamlShardingSphereDataSourceFactory.createDataSource(YamlShardingSphereDataSourceFactory.java:102)
 ~[shardingsphere-jdbc-core-5.4.0.jar:5.4.0]
        at 
org.apache.shardingsphere.driver.jdbc.core.driver.DriverDataSourceCache.createDataSource(DriverDataSourceCache.java:51)
 ~[shardingsphere-jdbc-core-5.4.0.jar:5.4.0]
        at 
java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
 ~[na:1.8.0_111]
        at 
org.apache.shardingsphere.driver.jdbc.core.driver.DriverDataSourceCache.get(DriverDataSourceCache.java:45)
 ~[shardingsphere-jdbc-core-5.4.0.jar:5.4.0]
        at 
org.apache.shardingsphere.driver.ShardingSphereDriver.connect(ShardingSphereDriver.java:51)
 ~[shardingsphere-jdbc-core-5.4.0.jar:5.4.0]
   ```
   First,NPE happen at standardProps.get("url").toString(),url is null.
   ```
    private Map<String, DataSourceMetaData> createDataSourceMetaDataMap(final 
Map<String, DataSource> dataSources, final Map<String, DatabaseType> 
storageTypes) {
           Map<String, DataSourceMetaData> result = new 
LinkedHashMap<>(dataSources.size(), 1F);
           for (Entry<String, DataSource> entry : dataSources.entrySet()) {
               Map<String, Object> standardProps = 
DataSourcePropertiesCreator.create(entry.getValue()).getConnectionPropertySynonyms().getStandardProperties();
               DatabaseType storageType = storageTypes.get(entry.getKey());
               result.put(entry.getKey(), 
storageType.getDataSourceMetaData(standardProps.get("url").toString(), 
standardProps.get("username").toString()));
           }
           return result;
       }
   ```
   
   Then I analyze the source code found that it is related to this 
implementation of 
org.apache.shardingsphere.infra.datasource.props.DataSourceProperties
   ```
      public DataSourceProperties(final String dataSourceClassName, final 
Map<String, Object> props) {
           this.dataSourceClassName = dataSourceClassName;
           Optional<DataSourcePoolMetaData> poolMetaData = 
TypedSPILoader.findService(DataSourcePoolMetaData.class, dataSourceClassName);
           Map<String, String> propertySynonyms = poolMetaData.isPresent() ? 
poolMetaData.get().getPropertySynonyms() : Collections.emptyMap();
           connectionPropertySynonyms = new ConnectionPropertySynonyms(props, 
propertySynonyms);
           poolPropertySynonyms = new PoolPropertySynonyms(props, 
propertySynonyms);
           customDataSourceProperties = new CustomDataSourceProperties(
                   props, getStandardPropertyKeys(), poolMetaData.isPresent() ? 
poolMetaData.get().getTransientFieldNames() : Collections.emptyList(), 
propertySynonyms);
       }
   ```
   AndataSourceClassName is my custom defined,but 
TypedSPILoader.findService(DataSourcePoolMetaData.class, dataSourceClassName) 
can`t find the DataSourcePoolMetaData.Map<String, String> propertySynonyms is 
null,so new ConnectionPropertySynonyms(props, propertySynonyms) can`t set url 
correct.
   
   
   
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: 
[email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to