Вызвано: java.lang.Исключение IllegalArgumentException: jdbcUrl требуется с именем класса драйвера

#java #spring #spring-boot

Вопрос:

Мой тест весенней загрузки выдает ошибку ниже во время сборки maven.

 "level":"ERROR","logger":"com.zaxxer.hikari.HikariConfig","msg":"HikariPool-1 - jdbcUrl is required with driverClassName."
 

Трассировка стека:

 Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'schedulerFactoryBean' defined in class path resource
[com/pit/SchedulerConfig.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: jdbcUrl is requir
ed with driverClassName.
Caused by: java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.
 

Метод, который выдает ошибку в моем MyApplicationTest.java

 @SpringBootTest
@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class,
    DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class })
@EnableConfigurationProperties(value = MyConfig.class)
class MyApplicationTest {

   @Test
   void contextLoads() {
   assertNotNull(myController);

   }
}
 

У моего pom есть эти зависимости в пути к классу.

  • пружинный загрузчик-стартер-веб
  • пружинный загрузчик-стартер-тест
  • весенняя интеграция-sftp
  • postgresql
  • джунит
  • кварцевый планировщик

Мой компонент источника данных настроен следующим образом

 @Configuration
public class MyDataSourceCfg {

  private DataSource appDataSource() {
    return DataSourceBuilder.create()
          .driverClassName("org.postgresql.Driver")
          .url(env.getProperty("url") // values are set from Environment
          .username(env.getProperty("user"))
          .password(env.getProperty("password")
          .build();
  }
}
 

Пожалуйста, расскажите мне, что происходит и как мне избежать этой ошибки. Я читал о настройке источника данных по-другому, если у вас несколько баз данных, но у меня только одна база данных postgres. Пожалуйста, поделитесь своими мыслями.

Комментарии:

1. .url(env.getProperty("url") похоже, что URL-адрес JDBC не содержит «jdcb: …». Ошибка часто находится в строке с комментарием.

2. @JoopEggen Свойства извлекаются из хранилища и помещаются в среду во время запуска. «jdbc:postgresql://…» — это то, как я его настроил. Я могу запустить приложение и запустить его, если пропущу тесты во время сборки.

3. Может быть, модульные тесты имеют другую конфигурацию? У Spring часто есть контекст приложения и тест контекста приложения. И тесты часто идут против другой базы данных.

4. [ERROR] contextLoads Time elapsed: 0 s <<< ERROR! java.lang.IllegalStateException: Failed to load ApplicationContext то, что я вижу чуть выше ошибки стека. Поставили тестовый класс в вопрос. В классе нет ничего другого, кроме одного другого проводного боба.

5. Извините, здесь я ничем не могу помочь. Вы можете начать с жестко закодированных строк: .url("jdbc: ...") , и ведения журнала.

Ответ №1:

Учитывая, что у вас есть все соответствующие зависимости. как подключиться к базе данных PostgreSQL с помощью Spring Data JPA, например :-

 <dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <scope>runtime</scope>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
 

и в application.properties файле:

 spring.datasource.url=jdbc:postgresql://localhost:5432/dev
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=org.postgresql.Driver

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL81Dialect
 

Благодаря мощной автоконфигурации SpringBoot вам не нужно явно создавать компонент источника данных, и если вы хотите, используйте эти значения свойств.

Комментарии:

1. Я мог бы использовать это, если бы знал, как получить доступ к свойствам из класса среды в файле yaml приложения, поскольку все значения помещаются на карту окружающей среды во время запуска из другого источника. Также следует отметить, что проблема решается, когда я жестко закодировал детали.