使用org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder的方法丢失

时间:2019-06-18 10:11:02

标签: java spring-boot jdbc

Caused by: java.lang.NoSuchMethodError: 
 org.springframework.util.MultiValueMap.addAll(Ljava/lang/Object;Ljava/util/List;)V

构建数据源时遇到此错误:

return new EmbeddedDatabaseBuilder()
                .setType(EmbeddedDatabaseType.H2)
                .setName("table_name")
                .setScriptEncoding("UTF-8")
                .addScript("classpath:sql_schema_path")
                .setDataSourceFactory(embeddedDataSourceFactory) // @bean to pass Factory values
                .build();

我想这个MultiValuedMap.addAll是在springframework试图构建构建EmbeddedDatabase的幕后使用的。不知道为什么会收到此错误,有什么建议吗?

1 个答案:

答案 0 :(得分:0)

好的,在我的情况下,我正在使用<springversion>4.2.5.RELEASE</springversion>,并且在maven存储库中清楚地表明如果我使用spring-boot-jdbc-2.1.5,则需要使用至少是springframework版本5.1.7.RELEASE mvn_link_here。我可能很想念它,我很糟糕。

如果某人仅使用spring,则应使用SimpleDriverDataSource的一部分org.springframework.jdbc.datasource,并使用它可以指定url,驱动程序,用户名和密码。

那里没有太多示例,所以我实现它并起作用的方式是这样的:

@Configuration
@PropertySource("classpath:properties.file")
public class DatabaseServiceImplTestConfig {

    @Autowired
    private Environment env;

    @Bean
    public DataSourceFactory embeddedDataSourceFactory() {
        return new DataSourceFactory() {
            @Override
            public ConnectionProperties getConnectionProperties() {
                return new ConnectionProperties() {

                    @Override
                    public void setUsername(String username) {}

                    @Override
                    public void setPassword(String password) {}

                    @Override
                    public void setUrl(String url) {}

                    @Override
                    public void setDriverClass(Class<? extends Driver> driverClass) {}

                };
            }

            @Override
            public DataSource getDataSource() {
                SimpleDriverDataSource sds = new SimpleDriverDataSource();
                sds.setDriverClass(com.mysql.jdbc.Driver.class); // <- try to return Driver object too (using setDriver)
                sds.setUrl(env.getProperty("jdbc.connection.url"));
                sds.setUsername(env.getProperty("jdbc.connection.username"));
                sds.setPassword(env.getProperty("jdbc.connection.password"));
                return sds;
            }
        };
    }

    @Bean
    public DataSource embeddedDataSource(DataSourceFactory embeddedDataSourceFactory) {

        return new EmbeddedDatabaseBuilder()
                .setType(EmbeddedDatabaseType.H2)
                .setName("table_name_here")
                .setScriptEncoding("UTF-8")
                .addScript("classpath:path/to/your/shema.sql")
                .setDataSourceFactory(embeddedDataSourceFactory)  // <- call the bean here
                .build();
    }