0

我在 Spring Boot 和创建我的第一个应用程序方面非常陌生。在创建数据源时,我使用带有前缀和要从 application.property 读取的属性的 @ConfigurationProperties。

但是,此设置似乎对我不起作用,并且我的程序没有运行。

我的 application.property 文件中的属性:

spring.datasource.url=jdbc:h2:file:~/appboot
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver

我的代码:

@Configuration
public class PersistentConfiguration {

    @Bean
    @ConfigurationProperties(prefix="spring.datasource")
    @Primary
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }
}

我知道这@ConfigurationProperties不是从我的文件中读取属性。如果我在 builder 方法中提供如下详细信息,则效果很好:

return DataSourceBuilder.create()
.url("jdbc:h2:file:~/appboot")
.username("sa")
.password("")
.driverClassName("org.h2.Driver")
.build();

我的 pom.xml 文件有:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.5.RELEASE</version>
</parent>

我的存储库类:

import org.springframework.data.jpa.repository.JpaRepository;

import com.boot.model.Shipwreck;

public interface ShipwreckRepository extends JpaRepository<Shipwreck, Long>{

}

我的主要课程:

@SpringBootApplication
public class App 
{
    public static void main( String[] args )
    {
        SpringApplication.run(App.class, args);
    }
}

错误:

org.springframework.beans.factory.BeanCreationException:在类路径资源[org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]中定义名称为“flywayInitializer”的bean创建错误:调用init方法失败;嵌套异常是 java.lang.IllegalArgumentException:驱动程序类名称需要 jdbcUrl。在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1699) ~[spring-beans-5.0.9.RELEASE.jar:5.0.9.RELEASE] 在 org.springframework.beans.factory。 support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:573) ~[spring-beans-5.0.9.RELEASE.jar:5.0.9.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory。IllegalArgumentException:驱动程序类名称需要 jdbcUrl。在 com.zaxxer.hikari.HikariConfig.validate(HikariConfig.java:1059) ~[HikariCP-2.7.9.jar:na] 在 com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:109) ~[HikariCP- 2.7.9.jar:na] 在 org.flywaydb.core.internal.util.jdbc.JdbcUtils.openConnection(JdbcUtils.java:51) ~[flyway-core-5.0.7.jar:na] 在 org.flywaydb。 core.internal.database.DatabaseFactory.createDatabase(DatabaseFactory.java:67) ~[flyway-core-5.0.7.jar:na] at org.flywaydb.core.Flyway.execute(Flyway.java:1634) ~[flyway -core-5.0.7.jar:na] at org.flywaydb.core.Flyway.migrate(Flyway.java:1168) ~[flyway-core-5.0.7.jar:na] at org.springframework.boot.autoconfigure .flyway.FlywayMigrationInitializer.afterPropertiesSet(FlywayMigrationInitializer.java:

如果我还需要提供任何其他信息,请告诉我。

4

2 回答 2

0

Spring Boot 为我们提供了许多创建应用程序的便利,例如如果您想使用数据库 H2,您只需将依赖项添加到您的pom文件中并在文件中添加相应的属性application.properties,有一些默认属性允许之间透明通信数据库和应用程序,例如:

# To save the db in memory
#spring.datasource.url=jdbc:h2:mem:test

# To save the db in a file within the project
spring.datasource.url=jdbc:h2:./db/test
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.platform=h2

我的意思是DataSource配置由 中的外部配置属性控制spring.datasource.*,因此您不需要定义PersistentConfiguration类,只需正确定义这些属性即可使应用程序运行良好。H2确保您在文件中添加了依赖pom.xml项:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

您还可以检查数据库中的数据:

http://<host>:<port>/<context-path>/h2-console/

例如:

http://localhost:8080/my-first-app/h2-console
于 2018-10-24T16:11:40.553 回答
0

检查这是否有帮助:

import java.util.Map;

import javax.sql.DataSource;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationProperties
public class PersistentConfiguration {

  Map<String, String> datasource;

  public DataSource getDatasources() {
    System.out.println("datasources ==="+datasource);
    return DataSourceBuilder.create()
        .url(datasource.get("url"))
        .username(datasource.get("username"))
        .password(datasource.get("password"))
        .driverClassName(datasource.get("driver-class-name"))
        .build();
  }

  public void setDatasource(Map<String, String> datasource) {
    this.datasource = datasource;
  }
}

application.properties 文件:

datasource[url]=jdbc:mysql://localhost:3000/andatabase?useSSL=false
datasource[username]=root
datasource[password]=password
datasource[driver-class-name]=com.mysql.jdbc.Driver

在控制器中:

@Autowired
PersistentConfiguration config;

@GetMapping("/language")
public ResponseEntity control() {

config.getDatasources();

return new ResponseEntity("success", HttpStatus.OK);
}
于 2018-10-24T12:22:13.037 回答