java 为什么Sping Boot 忽略我的h2数据库在application.properties中的spring. spring.url?

nwo49xxi  于 5个月前  发布在  Java
关注(0)|答案(1)|浏览(58)

我有一个Sping Boot 应用程序,它创建了一个h2数据库并加载了一些测试数据,然后我想用h2控制台查看这些数据。
以下是我的application.properties:

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. boot.url并且Sping Boot 使用默认的数据库路径(jdbc:h2:dbc:testdb),我可以打开h2控制台,连接到db并查看数据。但是如果我像上面那样指定URL,Sping 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。为什么Sping Boot 会忽略我给出的JDBC URL?
application.properties也应该在正确的路径:src/main/resources/application.properties x1c 0d1x
其他可能相关的文件:
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 Boot 日志:

:: 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,Sping Boot 3.2.1,VS Code with Java extensions

i86rm4rw

i86rm4rw1#

当你手动创建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("custom_db")
            .addScripts("classpath:jdbc/schema.sql", "classpath:jdbc/data.sql")
            .build();
}

字符串

编辑

H2类型中使用EmbeddedDatabaseBuilder时,它默认为内存数据库,到目前为止,还没有一种直接的方法来自定义此行为。可能值得考虑联系开发团队询问添加此功能的可能性。作为替代方案,如果您更喜欢使用文件模式,可以通过配置来实现相同的功能。
以下是一些示例配置:

spring:
  h2:
    console:
      enabled: true
  datasource:
    url: jdbc:h2:file:C:/data/sample    # Windows only
    username: sa
    password: sa
  sql:
    init:
      schema-locations: classpath:jdbc/schema.sql
      data-locations: classpath:jdbc/data.sql

相关问题