获取DataSource的时候失败,原因是SqlValidator.Config.DEFAULT值为空

获取DataSource的时候失败,原因是SqlValidator.Config.DEFAULT值为空,

使用环境:

  1. 传统web项目,不是boot项目;
  2. Tomcat中间件
  3. 数据库oracle11
  4. shardingsphere 5.0.0 jar包;

场景、问题:

  • 想利用shardingsphere的数据脱密功能;
  • 现在通过工厂类获取DataSource就失败了
  • springboot的项目是没问题,能正常获取到;

已进行操作:

已经确定是OptimizerPlannerContextFactory.createValidator()方法里获取SqlValidator.Config.DEFAULT值为空,

现状:

不能正常启动

DEMO代码

public Connection getConnection() throws SQLException {

        String tableName = "IRP_METADATAPROBE";
        String logicColumn = "M_DATASOURCE";
        String cipherColumn = "M_DATASOURCE_ENCRYPT";
        String plainColumn = logicColumn;
        String encryptorName = "aes_encrypt";

        /* 数据源 */
        BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
        ds.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:ORCL");
        ds.setUsername("CHRQ_YBPCS_YFK");
        ds.setPassword("CHRQ_YBPCS_YFK");

//        DataSource ds = DataSourceFinder.getInstance().findDataSource(DBConnectionManager.getInstance().getJNDI());

        /* 数据加密规则配置 */
        Properties encryptProperties = new Properties();
        encryptProperties.setProperty("aes-key-value", "123456");
        EncryptColumnRuleConfiguration columnConfigAes = new EncryptColumnRuleConfiguration(logicColumn, cipherColumn, "", plainColumn, encryptorName);
        EncryptTableRuleConfiguration encryptTableRuleConfig = new EncryptTableRuleConfiguration(tableName, Arrays.asList(columnConfigAes),true);
        Map<String, ShardingSphereAlgorithmConfiguration> encryptAlgorithmConfigs = new LinkedHashMap<>(1, 1);
        encryptAlgorithmConfigs.put(encryptorName, new ShardingSphereAlgorithmConfiguration("AES", encryptProperties));
        EncryptRuleConfiguration encryptRuleConfiguration = new EncryptRuleConfiguration(Collections.singleton(encryptTableRuleConfig), encryptAlgorithmConfigs);

        /* 属性*/
        Properties props = new Properties();
        props.setProperty("sql-show",String.valueOf(true));

        DataSource dataSource = ShardingSphereDataSourceFactory.createDataSource(ds, Arrays.asList(encryptRuleConfiguration),props);
        Connection connection = dataSource.getConnection();
        return connection;
    }

异常栈

java.lang.ExceptionInInitializerError
	at org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContextFactory.createValidator(OptimizerPlannerContextFactory.java:107)
	at org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContextFactory.create(OptimizerPlannerContextFactory.java:70)
	at org.apache.shardingsphere.infra.federation.optimizer.context.OptimizerContextFactory.create(OptimizerContextFactory.java:49)
	at org.apache.shardingsphere.mode.metadata.MetaDataContextsBuilder.build(MetaDataContextsBuilder.java:98)
	at org.apache.shardingsphere.mode.manager.memory.MemoryContextManagerBuilder.build(MemoryContextManagerBuilder.java:49)
	at org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource.createContextManager(ShardingSphereDataSource.java:81)
	at org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource.<init>(ShardingSphereDataSource.java:64)
	at org.apache.shardingsphere.driver.api.ShardingSphereDataSourceFactory.createDataSource(ShardingSphereDataSourceFactory.java:77)
	at org.apache.shardingsphere.driver.api.ShardingSphereDataSourceFactory.createDataSource(ShardingSphereDataSourceFactory.java:92)
	at org.apache.shardingsphere.driver.api.ShardingSphereDataSourceFactory.createDataSource(ShardingSphereDataSourceFactory.java:123)
	at org.apache.shardingsphere.driver.api.ShardingSphereDataSourceFactory.createDataSource(ShardingSphereDataSourceFactory.java:178)
	at com.jiuqi.bi.irp.core.metadataprobe.util.ShardingManager.getConnection(ShardingManager.java:58)
	at com.jiuqi.bi.irp.core.metadataprobe.manager.MetadataProbeManager.addSchemaInfo(MetadataProbeManager.java:198)
	at com.jiuqi.bi.irp.core.metadataprobe.IRPMetadataProbeResource.managerSchemaInfo(IRPMetadataProbeResource.java:204)
	at com.jiuqi.bi.irp.core.metadataprobe.IRPMetadataProbeResource.post(IRPMetadataProbeResource.java:106)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.restlet.resource.ServerResource.doHandle(ServerResource.java:496)
	at org.restlet.resource.ServerResource.post(ServerResource.java:1208)
	at org.restlet.resource.ServerResource.doHandle(ServerResource.java:585)
	at org.restlet.resource.ServerResource.doNegotiatedHandle(ServerResource.java:642)
	at org.restlet.resource.ServerResource.doConditionalHandle(ServerResource.java:341)
	at org.restlet.resource.ServerResource.handle(ServerResource.java:944)
	at org.restlet.resource.Finder.handle(Finder.java:246)
	at org.restlet.routing.Filter.doHandle(Filter.java:159)
	at org.restlet.routing.Filter.handle(Filter.java:206)
	at org.restlet.routing.Router.doHandle(Router.java:431)
	at org.restlet.routing.Router.handle(Router.java:648)
	at org.restlet.routing.Filter.doHandle(Filter.java:159)
	at org.restlet.routing.Filter.handle(Filter.java:206)
	at org.restlet.routing.Filter.doHandle(Filter.java:159)
	at org.restlet.routing.Filter.handle(Filter.java:206)
	at org.restlet.routing.Filter.doHandle(Filter.java:159)
	at org.restlet.routing.Filter.handle(Filter.java:206)
	at org.restlet.routing.Filter.doHandle(Filter.java:159)
	at org.restlet.routing.Filter.handle(Filter.java:206)
	at org.restlet.routing.Filter.doHandle(Filter.java:159)
	at org.restlet.engine.application.StatusFilter.doHandle(StatusFilter.java:154)
	at org.restlet.routing.Filter.handle(Filter.java:206)
	at org.restlet.routing.Filter.doHandle(Filter.java:159)
	at org.restlet.routing.Filter.handle(Filter.java:206)
	at org.restlet.engine.CompositeHelper.handle(CompositeHelper.java:211)
	at org.restlet.engine.application.ApplicationHelper.handle(ApplicationHelper.java:84)
	at org.restlet.Application.handle(Application.java:381)
	at org.restlet.routing.Filter.doHandle(Filter.java:159)
	at org.restlet.routing.Filter.handle(Filter.java:206)
	at org.restlet.routing.Router.doHandle(Router.java:431)
	at org.restlet.routing.Router.handle(Router.java:648)
	at org.restlet.routing.Filter.doHandle(Filter.java:159)
	at org.restlet.routing.Filter.handle(Filter.java:206)
	at org.restlet.routing.Router.doHandle(Router.java:431)
	at org.restlet.routing.Router.handle(Router.java:648)
	at org.restlet.routing.Filter.doHandle(Filter.java:159)
	at org.restlet.engine.application.StatusFilter.doHandle(StatusFilter.java:154)
	at org.restlet.routing.Filter.handle(Filter.java:206)
	at org.restlet.routing.Filter.doHandle(Filter.java:159)
	at org.restlet.routing.Filter.handle(Filter.java:206)
	at org.restlet.engine.CompositeHelper.handle(CompositeHelper.java:211)
	at org.restlet.Component.handle(Component.java:392)
	at org.restlet.Server.handle(Server.java:516)
	at org.restlet.engine.ServerHelper.handle(ServerHelper.java:72)
	at org.restlet.engine.adapter.HttpServerHelper.handle(HttpServerHelper.java:152)
	at org.restlet.ext.servlet.ServerServlet.service(ServerServlet.java:1089)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at com.jiuqi.bi.server.bsp.login.filter.RedirectFilter.doFilter(RedirectFilter.java:171)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at com.jiuqi.bi.i18n.server.utils.I18nFilter.doFilter(I18nFilter.java:23)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at com.jiuqi.bi.server.bsp.login.filter.CompressFilter.doFilter(CompressFilter.java:51)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at com.jiuqi.sf.filter.WebServicesURLFilter.doFilter(WebServicesURLFilter.java:48)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:615)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:818)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1626)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
	at sun.reflect.annotation.TypeAnnotationParser.mapTypeAnnotations(TypeAnnotationParser.java:356)
	at sun.reflect.annotation.AnnotatedTypeFactory$AnnotatedTypeBaseImpl.<init>(AnnotatedTypeFactory.java:139)
	at sun.reflect.annotation.AnnotatedTypeFactory.buildAnnotatedType(AnnotatedTypeFactory.java:65)
	at sun.reflect.annotation.TypeAnnotationParser.buildAnnotatedType(TypeAnnotationParser.java:79)
	at java.lang.reflect.Executable.getAnnotatedReturnType0(Executable.java:633)
	at java.lang.reflect.Method.getAnnotatedReturnType(Method.java:648)
	at org.apache.calcite.util.ImmutableBeans.makeDef(ImmutableBeans.java:146)
	at org.apache.calcite.util.ImmutableBeans.access$000(ImmutableBeans.java:55)
	at org.apache.calcite.util.ImmutableBeans$1.load(ImmutableBeans.java:68)
	at org.apache.calcite.util.ImmutableBeans$1.load(ImmutableBeans.java:65)
	at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3529)
	at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2278)
	at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2155)
	at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2045)
	at com.google.common.cache.LocalCache.get(LocalCache.java:3951)
	at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3974)
	at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4958)
	at org.apache.calcite.util.ImmutableBeans.create_(ImmutableBeans.java:95)
	at org.apache.calcite.util.ImmutableBeans.create(ImmutableBeans.java:76)
	at org.apache.calcite.sql.validate.SqlValidator$Config.<clinit>(SqlValidator.java:792)
	... 100 more

@tuichenchuxin 出新帮忙调查下这个问题

好的,我来试一下看看

感谢,
这个问题我已经解决了,web环境下会缺少很多依赖,这个问题就是@Nullable的注解依赖包没有引入

        @Property
        @Nullable
        SqlTypeCoercionRule typeCoercionRules();

棒棒! :+1:

京ICP备2021015875号