繁体   English   中英

Spring 引导项目未绑定来自 application.properties 的 @Value

[英]Spring Boot project not binding @Value from application.properties

I am in the process of migrating an existing multi-module maven project to spring boot 2.6.1 and I've populated application.properties in the resources folder of one of the modules (the one with the SpringBootApplication entry point and with the spring boot maven 插件)。 我可以通过应用程序环境从项目中的任何模块访问这些属性。 但是使用 @Value 绑定属性不起作用

以下是我的项目结构

PROJ
└── pom.xml
└── ModuleA
    └── src
        └── main
            └── java
                └── com.example
                    └── abc
                        └── configuration
                            └── TestConfig.java
                        └── MyApplication.java
            └── resources
                └── application.properties
    └── pom.xml
└── ModuleB     

为什么@ConfigurationProperties 或@Value 的属性绑定会失败? (我正在尝试使用 @ConfigurationProperties 将所有数据源属性绑定到 ModuleB 中的 DataSourceProperties bean,如文档中所述- 但这也不起作用。)

我尝试过的事情:

  • 将 application.properties 放在配置目录中;
  • 在 pom 文件中指定资源的位置;
  • 创建一个具有相同结构的新多模块项目(它确实在这个“干净”项目中工作,所以问题必须在迁移项目的现有配置中。我试图比较两个项目之间的差异,但应用了相似的配置我仍然无法让自动绑定在我迁移的项目中工作。)

编码:

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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>PROJ</artifactId>
    <version>1.0</version>
    <packaging>pom</packaging>
    <name>PROJ</name>

    <modules>
        <module>ModuleA</module>
        <module>ModuleB</module>
        <!-- Other modules -->
    </modules>

    <profiles>
        <profile>
            <id>dev</id>
            <properties>
                <develop.mode>true</develop.mode>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <develop.mode>false</develop.mode>
            </properties>
        </profile>
    </profiles>

    <properties>
        <!-- Project Properties -->
    </properties>

    <dependencyManagement>
        <dependencies>
            <!-- In House Modules -->
            <dependency>
                <groupId>com.example</groupId>
                <artifactId>ModuleB</artifactId>
                <version>1.0</version>
            </dependency>
            <dependency>
                <groupId>com.example</groupId>
                <artifactId>ModuleA</artifactId>
                <version>1.0</version>
            </dependency>

            <!-- Spring -->
            <dependency>
                <!-- Import dependency management from Spring Boot -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-instrument</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
                <version>${spring.version}</version>
            </dependency>

            <dependency>
                <groupId>org.springframework.plugin</groupId>
                <artifactId>spring-plugin-core</artifactId>
                <version>${spring-plugin.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.plugin</groupId>
                <artifactId>spring-plugin</artifactId>
                <version>${spring-plugin.version}</version>
                <type>pom</type>
            </dependency>

            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-saml2-service-provider</artifactId>
                <version>5.5.0-BETA</version>
                <classifier>BETA</classifier>
            </dependency>
            <dependency>
                <groupId>org.springframework.security.oauth</groupId>
                <artifactId>spring-security-oauth</artifactId>
                <version>${spring-security-oauth.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.security.oauth</groupId>
                <artifactId>spring-security-oauth2</artifactId>
                <version>${spring-security-oauth.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework</groupId>
                        <artifactId>spring-webmvc</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>

            <!-- Various other dependencies -->
            
        </dependencies>

    </dependencyManagement>

    <build>
        <pluginManagement>
            <plugins>
                <!-- Various plugins  -->
            </plugins>
        </pluginManagement>
    </build>

</project>

模块A/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <artifactId>PROJ</artifactId>
        <groupId>com.example</groupId>
        <version>1.0</version>
    </parent>

    <artifactId>ModuleA</artifactId>
    <packaging>jar</packaging>
    <name>ModuleA</name>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <!-- In House Modules -->
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>ModuleB</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

应用程序属性

# My datasource properties
app.datasource.myds.username=TestName

MyApplication.java

@SpringBootApplication
public class WSMBootApp {
    public static void main(String[] args) {
        SpringApplication.run(WSMBootApp.class, args);
    }
}

TestConfig.java

@Configuration
public class TestConfig {

    @Value("${app.datasource.myds.username}")
    public String un;

    @Bean(name = "testbean1")
    @Primary
    public Boolean testbean1() {
        System.out.println("Value un: " + un); // prints null
        return Boolean.FALSE;
    }

    @Bean(name = "testbean2")
    public Boolean testbean2(Environment env) {
        System.out.println("Env property: " + env.getProperty("app.datasource.myds.username")); // prints TestName 
        return Boolean.TRUE;
    }
}

我找到了 Spring Boot 没有使用 @Value 或 @ConfigurationProperties 自动装配我的属性的原因。事实证明,我尝试迁移的项目实现了一个无法正确初始化属性的 PropertyPlaceholderConfigurer bean。 我已经取消了那个 bean,应用程序现在正在加载和自动装配来自 application.properties 的所有属性(来自所有模块)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM