Конфигурация свойства с префиксом не работает
Я очень новичок в весенней загрузке и создаю свое первое приложение. При создании источника данных я использую @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);
}
}
ошибка:
org.springframework.beans.factory.BeanCreationException: Ошибка при создании компонента с именем 'flywayInitializer', определенным в ресурсе пути к классу [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: сбой вызова метода init; Вложенное исключение - java.lang.IllegalArgumentException: jdbcUrl требуется с driverClassName. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1699) ~[spring-beans-5.0.9.RELEASE.jar:5.0.9.RELEans, или support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:573) ~[spring-beans-5.0.9.RELEASE.jar:5.0.9.RELEASE] в org.springframework.:495) ~[spring-beans-5.0.9.RELEASE.jar:5.0.9.RELEASE] в org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317) ~[весна -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] at 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. поддержка) ~[spring-context-5.0.9.RELEASE.jar:5.0.9.RELEASE] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) ~[spring-context-5.0.9. RELEASE.jar: 5.0. 9.RELEASE] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140) ~[spring-boot-2.0.5.RELEASE.jar: 2.0.5.RELEASE] springframework.boot.SpringApplication.refresh (SpringApplication.java:780) [spring-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) ~[Hikari 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] в org.flywaydb.core.Flyway.execute(Flyway.java:1634) ~[flyway-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. AbstractAutowireCapableBeanFactory.java:1758) ~[spring-beans-5.0.9.RELEASE.jar:5.0.9.RELEASE] в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1695) ~[spring-beans-5.0.9.RELEASE.jar:5.0.9.RELEASE] ... 18 опущенных общих фреймов
Пожалуйста, дайте мне знать, если мне нужно будет предоставить любую другую информацию.
3 ответа
Проверьте, помогает ли это:
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);
}
Из трассировки стека:
java.lang.IllegalArgumentException: jdbcUrl требуется с driverClassName.
У тебя есть h2
зависимость в пом? Если нет, попробуйте добавить следующее в pom.
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.197</version>
</dependency>
И, кстати, вам не нужно вручную создавать DataSource
боб. Он будет создан со свойствами в конфигурации.
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