为什么 Spring boot 忽略我的 h2 数据库的 spring.database.url?

问题描述 投票:0回答:1

我有一个 Spring boot 应用程序,它创建一个 h2 数据库并加载一些测试数据,然后我想使用 h2 控制台查看这些数据。

这是我的应用程序。属性:

spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.datasource.url=jdbc:h2:file:D:/ProgrammingStuff/wiktionaries/wiktdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=create-drop

如果我注释掉 spring.datasource.url 并且 Spring boot 使用默认数据库路径(jdbc:h2:mem:testdb),我可以打开 h2 控制台,连接到数据库并查看数据。但是如果我像上面那样指定 URL,Spring boot 控制台仍然显示行

2023-12-29T10:23:56.665+01:00  INFO 9904 --- [  restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration    : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb'
。我无法使用给定的数据库 URL 连接到它,只能使用
jdbc:h2:mem:testdb
URL。为什么 Spring boot 会忽略我给出的 JDBC URL?

application.properties也应该位于正确的路径中:src/main/resources/application.properties

其他可能相关的文件:

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.1</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.pux12</groupId>
    <artifactId>dictionarycreator</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>dictionarycreator</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>21</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <version>3.2.1</version>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20231013</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.jsonschema2pojo</groupId>
                <artifactId>jsonschema2pojo-maven-plugin</artifactId>
                <version>1.2.1</version>
                <configuration>
                    <sourceDirectory>${basedir}/src/main/resources/wiktionary</sourceDirectory>
                    <targetPackage>com.example.types</targetPackage>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

SpringJdbcConfig.java

package com.pux12.dictionarycreator;

import javax.sql.DataSource;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;

@Configuration
@ComponentScan("com.pux12.dictionarycreator")
public class SpringJdbcConfig {
  @Bean
  public DataSource dataSource() {
    return new EmbeddedDatabaseBuilder()
        .setType(EmbeddedDatabaseType.H2)
        .addScript("classpath:jdbc/schema.sql")
        .addScript("classpath:jdbc/data.sql").build();
  }
}

Spring启动日志:

 :: Spring Boot ::                (v3.2.1)

2023-12-29T10:49:54.327+01:00  INFO 14272 --- [  restartedMain] c.p.d.DictionarycreatorApplication       : Starting DictionarycreatorApplication using Java 21.0.1 with PID 14272 (C:\Users\hanne\Documents\Programme\dictionarycreator\target\classes started by hanne in C:\Users\hanne\Documents\Programme\dictionarycreator)
2023-12-29T10:49:54.332+01:00  INFO 14272 --- [  restartedMain] c.p.d.DictionarycreatorApplication       : No active profile set, falling back to 1 default profile: "default"
2023-12-29T10:49:54.418+01:00  INFO 14272 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable
2023-12-29T10:49:54.418+01:00  INFO 14272 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'
2023-12-29T10:49:56.425+01:00  INFO 14272 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with 
port 8080 (http)
2023-12-29T10:49:56.456+01:00  INFO 14272 --- [  restartedMain] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2023-12-29T10:49:56.458+01:00  INFO 14272 --- [  restartedMain] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.17]
2023-12-29T10:49:56.555+01:00  INFO 14272 --- [  restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2023-12-29T10:49:56.558+01:00  INFO 14272 --- [  restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2137 ms
2023-12-29T10:49:56.589+01:00  INFO 14272 --- [  restartedMain] o.s.j.d.e.EmbeddedDatabaseFactory        : Starting embedded database: url='jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa'
2023-12-29T10:49:56.860+01:00  INFO 14272 --- [  restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration    : H2 console available at 
'/h2-console'. Database available at 'jdbc:h2:mem:testdb'
2023-12-29T10:49:57.775+01:00  INFO 14272 --- [  restartedMain] o.s.b.d.a.OptionalLiveReloadServer       : LiveReload server is running on port 35729
2023-12-29T10:49:57.834+01:00  INFO 14272 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8080 (http) with context path ''
2023-12-29T10:49:57.853+01:00  INFO 14272 --- [  restartedMain] c.p.d.DictionarycreatorApplication       : Started DictionarycreatorApplication in 4.008 seconds (process running for 4.663)

Windows 10、Spring Boot 3.2.1、带有 Java 扩展的 VS Code

java spring spring-boot h2
1个回答
0
投票

当您手动创建

Datasource
bean 时,它不会遵循配置的
spring.datasource
设置。具体来说,当您使用
.setType(EmbeddedDatabaseType.H2)
时,它将生成具有默认配置的数据源,除非在创建过程中显式覆盖。

有关

ConnectionProperties
的更多详细信息,您可以在
org.springframework.jdbc.datasource.embedded.H2EmbeddedDatabaseConfigurer
中探索 H2 使用的默认配置。

要更新您的案例中的 URL,您可以修改

Datasource
bean,如下所示:

@Bean
public DataSource dataSource() {
    return new EmbeddedDatabaseBuilder()
            .setType(EmbeddedDatabaseType.H2)
            .setName("file:D:/ProgrammingStuff/wiktionaries/wiktdb")
            .addScript("classpath:jdbc/schema.sql")
            .addScript("classpath:jdbc/data.sql")
            .build();
}
© www.soinside.com 2019 - 2024. All rights reserved.