【问题标题】:External Spring boot properties not read未读取外部 Spring 引导属性
【发布时间】:2019-12-27 20:10:44
【问题描述】:

我使用的是 spring boot 2.2.2 并且我有一些我想从属性文件中读取的外部属性。 当属性是默认 application.properties 的一部分时,所有属性都会被读取,但是当我将其移动到单独的属性文件时,它们似乎没有被读取。

我有以下课程:

@Getter
@ConfigurationProperties  //I use @ConfigurationPropertiesScan with @SpringBootApplication
@PropertySource(value = "classpath:myprops.properties")
public class MyProperties {

    private final String prop1;
    private final Integer prop2;
    private final String prop3;

    @ConstructorBinding
    public MyProperties (String prop1, Integer prop2, String prop3) {
        this.prop1= prop1;
        this.prop2= prop2;
        this.prop3= prop3;
    }
}

所以 prop1、prop2 和 prop3 在 application.properties 中时获得它们的值(当然也省略了 @PropertySource 注释),但是当我将它移动到资源下的 myprops.properties 时,我看到 prop1、prop2 和 prop3 为 null写在上面

【问题讨论】:

  • 请将您的目录结构与您的道具文件的位置以及您的道具文件的内容一起发布。
  • 我暂时不用配置文件。该结构是打开新的 Spring Boot Maven 项目时的默认结构。我在资源文件夹中添加了新的属性文件
  • 通常@PropertySource应该和@Configuration一起使用。所以在你的MyProperties.java 类中添加@Configuration
  • 您如何实际创建MyProperties 实例?我看不到任何注释使 Spring 实例化它(组件、配置等)。

标签: java spring-boot


【解决方案1】:

尝试创建带有@Configuration 注释的类,就像在docs 中一样

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@PropertySource(value = "classpath:myprops.properties")
public class MyConfiguration {
}

MyProperties 类中删除@PropertySource 并将其放在MyConfiguration 中。

更新:

使其工作的步骤:

1) 转到https://start.spring.io。生成项目并添加:Spring Configuration Processor 和 Lombok(启用注释处理)

2) 添加或检查:

  • myprops.properties 到资源(在 application.properties 旁边)
  • MyConfiguration 和 MyProperties 旁边有 main 方法的类
package com.example.demostackannotations;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@PropertySource(value = "classpath:myprops.properties")
public class MyConfiguration {
}
package com.example.demostackannotations;

import lombok.Getter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.ConstructorBinding;

@Getter
@ConfigurationProperties
public class MyProperties {

    private final String prop1;
    private final Integer prop2;
    private final String prop3;

    @ConstructorBinding
    public MyProperties(String prop1,  Integer prop2,  String prop3) {
        this.prop1 = prop1;
        this.prop2 = prop2;
        this.prop3 = prop3;
    }
}
  • @ConfigurationPropertiesScan 到带有 main 方法的类
@SpringBootApplication
@ConfigurationPropertiesScan
public class DemoStackAnnotationsApplication {

    public static void main(String[] args) {
        ApplicationContext app = SpringApplication.run(DemoStackAnnotationsApplication.class, args);
        MyProperties props = app.getBean(MyProperties.class);
        System.out.println(props.getProp1());
        System.out.println(props.getProp2());
        System.out.println(props.getProp3());
    }
}
  • 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>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo-stack-annotations</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo-stack-annotations</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

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

</project>

【讨论】:

  • 我添加了对我有用的详细“操作方法”
猜你喜欢
  • 2016-11-16
  • 2019-07-31
  • 2018-06-25
  • 2015-08-15
  • 2011-08-23
  • 2018-02-25
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
相关资源
最近更新 更多