【问题标题】:Missing methods using org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder缺少使用 org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder 的方法
【发布时间】:2019-06-18 10:11:02
【问题描述】:
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 时在幕后使用。不知道为什么我会收到这个错误,有什么建议吗?

【问题讨论】:

  • 该错误提示您正在组合不同版本的 Spring 依赖项。确保你的依赖是一致的。
  • 请不要在标题中添加“已解决”之类的内容。如果您设法解决了问题,请接受帮助您解决问题的答案,或者发布您自己的答案并在超时后接受。
  • 我添加了“已解决”,如果有人有熟悉的问题,并且当 github 推荐已经存在的熟悉问题时,他们可以看到它已解决,但我会在几天后接受我的回答(:

标签: java spring-boot jdbc


【解决方案1】:

好吧,就我而言,我使用的是<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();
    }

【讨论】:

  • 如果您使用的是 Spring Boot,那么您甚至不应该指定任何 Spring 依赖项的版本,而是依赖 Spring Boot BOM 来为您确定版本。
猜你喜欢
  • 2012-02-11
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多