ConfigurationProperties с префиксом не работает

Я новичок в весенней загрузке и создаю свое первое приложение. При создании источника данных я использую @ConfigurationProperties с префиксом и свойствами для чтения из application.property.

Однако эта установка, похоже, не работает для меня, и моя программа не работает.

Мои свойства из файла 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 не читает свойства из моего файла. Если я предоставлю подробную информацию о методе построения, как показано ниже, он будет работать хорошо:

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);
    }
}

ошибка:

Пожалуйста, дайте мне знать, если мне нужно предоставить другую информацию.

Проверьте, помогает ли это:


person Kapil Choubisa    schedule 24.10.2018    source источник
comment
Я думаю, что использую его только через репозиторий JPA. Repository добавлен в мой pom.xml, и я отредактировал свой вопрос с помощью моего класса репозитория. Сейчас он пуст.   -  person Boris    schedule 24.10.2018
comment
Можете ли вы добавить соответствующий код, чтобы избежать каких-либо предположений?   -  person Kapil Choubisa    schedule 24.10.2018
comment
org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем flywayInitializer, определенным в ресурсе пути к классу [org / springframework / boot / autoconfigure / flyway / FlywayAutoConfiguration $ FlywayConfiguration.class]: не удалось вызвать метод инициализации; вложенное исключение - java.lang.IllegalArgumentException: jdbcUrl требуется с driverClassName. по адресу org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean (AbstractAutowireCapableBeanFactory.java:1699) ~ [spring-beans-5.0.9.RELEASE.jar: 5.0.9.RELEASEbeansing.fctory.fctory.fctory.factory. support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:573) ~ [spring-beans-5.0.9.RELEASE.jar: 5.0.9.RELEASE] в org.springframework.beans.beans.factory.supportajava.CreateCreateCreateBeans.factory.supporta : 495) ~ [spring-beans-5.0.9.RELEASE.jar: 5.0.9.RELEASE] в org.springframework.beans.factory.support.AbstractBeanFactory.lambda $ doGetBean $ 0 (AbstractBeanFactory.java:317) ~ [spring -beans-5.0.9.RELEASE.jar: 5.0.9.RELEASE] в org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) ~ [spring-beans-5.0.9.RELEASE. jar: 5.0.9.RELEASE] в org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean ( AbstractBeanFactory.java:315) ~ [spring-beans-5.0.9.RELEASE.jar: 5.0.9.RELEASE] в org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) ~ [spring -beans-5.0.9.RELEASE.jar: 5.0.9.RELEASE] в org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:304) ~ [spring-beans-5.0.9.RELEASE. jar: 5.0.9.RELEASE] в org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) ~ [spring-beans-5.0.9.RELEASE.jar: 5.0.9.RELEASE] в org.springframework.context.support.AbstractApplicationContext.getBean (AbstractApplicationContext.java:1089) ~ [spring-context-5.0.9.RELEASE.jar: 5.0.9.RELEASE] в org.springframework.context.support.AbstractFrameworkContext.support.AbstractApplicationContextantext.AbstractApplicationContextanization. (AbstractApplicationContext.java:859) ~ [spring-context-5.0.9.RELEASE.jar: 5.0.9.RELEASE] в org.springframework.context.support.AbstractApplicationContext.refresh (AbstractAp plicationContext.java:550) ~ [spring-context-5.0.9.RELEASE.jar: 5.0.9.RELEASE] в org.springframework.boot.web.servlet.context. ServletWebServerApplicationContext.refresh (ServletWebServerApplicationContext.java:140) ~ [spring-boot-2.0.5.RELEASE.jar: 2.0.5.RELEASE] в org.springframework.boot.SpringApplication.refresh (SpringApplication.java:780) boot-2.0.5.RELEASE.jar: 2.0.5.RELEASE] в org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:412) [spring-boot-2.0.5.RELEASE.jar: 2.0.5. RELEASE] в org.springframework.boot.SpringApplication.run (SpringApplication.java:333) [spring-boot-2.0.5.RELEASE.jar: 2.0.5.RELEASE] в org.springframework.boot.SpringApplication.run (SpringApplication .java: 1277) [spring-boot-2.0.5.RELEASE.jar: 2.0.5.RELEASE] в org.springframework.boot.SpringApplication.run (SpringApplication.java:1265) [spring-boot-2.0.5. RELEASE.jar: 2.0.5.RELEASE] в com.boot.App.main (App.java:15) [classes /: na] Вызвано: java.lang.IllegalArgumentException: jdbcUrl требуется с driverClassName. на com.zaxxer.hikari.HikariConfig.validate (HikariConfig.java:1059) ~ [HikariCP-2.7.9.jar: na] на com.zaxxer.hikari.HikariDataSource.getConnection (HikariDataSource.java:109) ~ [HikariDataSource.java:109) 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) ~ [пролетный путь -core-5.0.7.jar: na] в org.flywaydb.core.Flyway.migrate (Flyway.java:1168) ~ [flyway-core-5.0.7.jar: na] в org.springframework.boot.autoconfigure .flyway.FlywayMigrationInitializer.afterPropertiesSet (FlywayMigrationInitializer.java:66) ~ [spring-boot-autoconfigure-2.0.5.RELEASE.jar: 2.0.5.RELEASE] по адресу org.springframework.beans.factory.support.InapitableAbstractAevodsanireC AbstractAutowireCapableBeanFactory.java:1758) ~ [spring-beans-5.0.9.RELEAS E.jar: 5.0.9.RELEASE] в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean (AbstractAutowireCapableBeanFactory.java:1695) ~ [spring-beans-5.0.9.RELEASE.RELEASE.jar: ] ... 18 общих кадров опущены   -  person Boris    schedule 24.10.2018


Ответы (2)


файл application.properties:

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;
  }
}

В контроллере:

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

Spring Boot дает нам много возможностей для создания приложений, например, если вы хотите использовать базу данных H2, вам нужно только добавить зависимость к вашему

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;
  }
}
файлу и добавить соответствующие свойства в файл
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);
}
person Molay    schedule 24.10.2018

Я имею в виду, что конфигурация DataSource управляется внешними свойствами конфигурации в spring.datasource.*, поэтому вам не нужно определять класс PersistentConfiguration, достаточно правильно определить эти свойства, чтобы приложение работало хорошо. Убедитесь, что вы добавили зависимость H2 в свой pom.xml файл:

# 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

Также вы можете проверить данные в базе данных:

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

Например:

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

Как вы получаете доступ к базе данных? 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
? Если, например, вы используете Spring Data JPA Repositories вам не нужно ничего, кроме свойств.

http://localhost:8080/my-first-app/h2-console
person JUAN CALVOPINA M    schedule 24.10.2018