我有一个 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
当您手动创建
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();
}