Shardingsphere: sharding-jdbc-core-spring-boot-starter 需要适配springboot 2.0

Created on 1 Mar 2018  ·  11Comments  ·  Source: apache/shardingsphere

我现在用这个

io.shardingjdbc
sharding-jdbc-core-spring-boot-starter
2.0.3

切换到springboot2.0, 首先 ds.pay_${0..9} 首先这个语法不支持,spring会识别成0..9为一个变量,找不到这个变量报错
当我替换成:ds.pay_#{'$'}{0..9},勉强能过去,但是报另一个错:
Caused by: java.lang.NoClassDefFoundError: org/springframework/boot/bind/RelaxedPropertyResolver at io.shardingjdbc.spring.boot.SpringBootConfiguration.setDataSourceMap(SpringBootConfiguration.java:53) at io.shardingjdbc.spring.boot.SpringBootConfiguration.setEnvironment(SpringBootConfiguration.java:49) at org.springframework.context.support.ApplicationContextAwareProcessor.invokeAwareInterfaces(ApplicationContextAwareProcessor.java:105) at org.springframework.context.support.ApplicationContextAwareProcessor.postProcessBeforeInitialization(ApplicationContextAwareProcessor.java:96) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:423) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1702) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:583) ... 52 common frames omitted Caused by: java.lang.ClassNotFoundException: org.springframework.boot.bind.RelaxedPropertyResolver at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 59 common frames omitted

discussion

Most helpful comment

这个issue怎么就close了?不准备支持spring boot2.0了吗?

All 11 comments

由于spring boot 2.0刚刚发布,我们暂时没需求也没精力去升级。因此如果社区的小伙伴有感兴趣的欢迎认领

搞了一天终于搞定了,改成编程方式调用,不用starter方式

@aaa5131421 同样遇到这个问题,已经是编程方式调用。跪求怎么解决
`
……………………
@Bean
@Primary
public static SqlSessionFactoryBean createSqlSessionFactoryBean() throws SQLException, IOException {

    SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
    // 设置mybatis configuration 扫描路径
    sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("META-INF/mybatis-config.xml"));

    // 添加mapper 扫描路径
    PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver = new PathMatchingResourcePatternResolver();
    sqlSessionFactoryBean.setMapperLocations(pathMatchingResourcePatternResolver.getResources(ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + "/META-INF/mapper/*.xml"));

    // 设置datasource
    DataSource dataSource = getMasterSlaveDataSource();
    sqlSessionFactoryBean.setDataSource(dataSource);
    return sqlSessionFactoryBean;
}

private static DataSource getMasterSlaveDataSource() throws SQLException {
    MasterSlaveRuleConfiguration masterSlaveRuleConfig = new MasterSlaveRuleConfiguration();
    masterSlaveRuleConfig.setName("ds_master_slave");
    masterSlaveRuleConfig.setMasterDataSourceName("ds_master");
    masterSlaveRuleConfig.setSlaveDataSourceNames(Arrays.asList("ds_slave_0", "ds_slave_1"));
    return MasterSlaveDataSourceFactory.createDataSource(createDataSourceMap(), masterSlaveRuleConfig, new ConcurrentHashMap<>());
}

private static Map<String, DataSource> createDataSourceMap() {
    final Map<String, DataSource> result = new HashMap<>(3, 1);
    result.put("ds_master", createDataSource("dev"));
    result.put("ds_slave_0", createDataSource("dev"));
    result.put("ds_slave_1", createDataSource("dev"));
    return result;
}

private static DataSource createDataSource(final String dataSourceName) {

    DruidDataSource result = new DruidDataSource();
    result.setDriverClassName(com.mysql.jdbc.Driver.class.getName());
    result.setUrl(URL_PREFIX + dataSourceName);
    result.setUsername(USER_NAME);
    result.setPassword(PASSWORD);
    return result;
}

……………………
`

@jixiaod 你什么问题

@aaa5131421 在这 #643

@aaa5131421 跟你这个一样的错误

Caused by: java.lang.NullPointerException: null
at io.shardingjdbc.spring.boot.SpringBootConfiguration.setDataSourceMap(SpringBootConfiguration.java:55) ~[sharding-jdbc-core-spring-boot-starter-2.0.3.jar:na]

@jixiaod
改成编程方式调用啊,你看看 shardingjdbc的文档, 那里有编程方式怎么调用,你只要通过shardingjdbc return 一个 datasource就可以了 这个datasource就可以当成一个bean被boot自动注入使用

@aaa5131421
把pom.xml的删除,就好了……

  <dependency>
        <groupId>io.shardingjdbc</groupId>
        <artifactId>sharding-jdbc-core-spring-boot-starter</artifactId>
        <version>2.0.3</version>
    </dependency>

这个issue怎么就close了?不准备支持spring boot2.0了吗?

我试验了sharding-jdbc-spring-boot-starter 3.1.0,应该支持Spring-boot 2.1.1.RELEASE


io.shardingsphere
sharding-jdbc-spring-boot-starter
3.1.0

Was this page helpful?
0 / 5 - 0 ratings