当前位置: 首页 > 知识库问答 >
问题:

如何在spring-boot应用程序中从application.yml文件中读取属性

伍昱
2023-03-14

我的应用程序有存储在applicaion.yml文件中的嵌套属性。
我希望在应用程序启动时将这些属性映射到POJO。

application.yml:

    demo:
     - A:
       - type: A
         prop1: 1
         prop2: 2
         proop3: 3
       - type: B
         prop1: 1
         prop2: 2
         proop3: 3
     - B:
       - type: A
         prop1: 1
         prop2: 2
         proop3: 3
       - type: B
         prop1: 1
         prop2: 2
         proop3: 3

为了实现这一点,我使用了以下注释:

@configuration
@enableConfigurationProperties
@configurationProperties(“demo”)

类演示:

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties("demo")
public class Demo {
    @JsonProperty("A")
    private List<A> a = null;
    @JsonProperty("B")
    private List<B> b = null;

    @JsonProperty("A")
    public List<A> getA() {
        return a;
    }

    @JsonProperty("A")
    public void setA(List<A> a) {
        this.a = a;
    }

    @JsonProperty("B")
    public List<B> getB() {
        return b;
    }

    @JsonProperty("B")
    public void setB(List<B> b) {
        this.b = b;
    }

    @Override
    public String toString() {
        return "Demo [a=" + a + ", b=" + b + "]";
    }   
}
public class A {

    @JsonProperty("type")
    private String type;
    @JsonProperty("prop1")
    private Integer prop1;
    @JsonProperty("prop2")
    private Integer prop2;
    @JsonProperty("proop3")
    private Integer proop3;

    @JsonProperty("type")
    public String getType() {
        return type;
    }

    @JsonProperty("type")
    public void setType(String type) {
        this.type = type;
    }

    @JsonProperty("prop1")
    public Integer getProp1() {
        return prop1;
    }

    @JsonProperty("prop1")
    public void setProp1(Integer prop1) {
        this.prop1 = prop1;
    }

    @JsonProperty("prop2")
    public Integer getProp2() {
        return prop2;
    }

    @JsonProperty("prop2")
    public void setProp2(Integer prop2) {
        this.prop2 = prop2;
    }

    @JsonProperty("proop3")
    public Integer getProop3() {
        return proop3;
    }

    @JsonProperty("proop3")
    public void setProop3(Integer proop3) {
        this.proop3 = proop3;
    }

    @Override
    public String toString() {
        return "A [type=" + type + ", prop1=" + prop1 + ", prop2=" + prop2 + ", proop3=" + proop3 + "]";
    }
}
public class B {

    @JsonProperty("type")
    private String type;
    @JsonProperty("prop1")
    private Integer prop1;
    @JsonProperty("prop2")
    private Integer prop2;
    @JsonProperty("proop3")
    private Integer proop3;

    @JsonProperty("type")
    public String getType() {
        return type;
    }

    @JsonProperty("type")
    public void setType(String type) {
        this.type = type;
    }

    @JsonProperty("prop1")
    public Integer getProp1() {
        return prop1;
    }

    @JsonProperty("prop1")
    public void setProp1(Integer prop1) {
        this.prop1 = prop1;
    }

    @JsonProperty("prop2")
    public Integer getProp2() {
        return prop2;
    }

    @JsonProperty("prop2")
    public void setProp2(Integer prop2) {
        this.prop2 = prop2;
    }

    @JsonProperty("proop3")
    public Integer getProop3() {
        return proop3;
    }

    @JsonProperty("proop3")
    public void setProop3(Integer proop3) {
        this.proop3 = proop3;
    }

    @Override
    public String toString() {
        return "B [type=" + type + ", prop1=" + prop1 + ", prop2=" + prop2 + ", proop3=" + proop3 + "]";
    }
}



主类

@SpringBootApplication
@ComponentScan(basePackages = {"com.microservice.*"})
@EnableJpaRepositories("com.microservice.*")
@EntityScan("com.microservice.*")
public class MainApplication {  
    public static void main(String[] args) {
         SpringApplication app = new SpringApplication(MainApplication.class);
            app.run();
            System.out.println("step 1");
            Demo config = new Demo();
            System.out.println("name: " + config);
        }

        public void run(String... args) throws Exception {
            System.out.println("step 2");

        }
}

但是我在O/P下面:
步骤1
名称:Demo[a=null,b=null]

共有1个答案

崔博延
2023-03-14

当您手动创建属性POJO的实例时,Spring并不知道它,并且不会进行属性绑定。

 SpringApplication app = new SpringApplication(MainApplication.class);
    app.run();
    System.out.println("step 1");
    Demo config = new Demo(); // Not a Spring managed bean!
    System.out.println("name: " + config);
}

与使用@enableConfigurationProperties注释配置不同,您可以将demo设置为bean,如类型安全配置属性中所示。

@Component
@ConfigurationProperties("demo")
public class Demo {
    ...
}

然后您可以从上下文中获得demobean:

@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(MainApplication.class, args);
        Demo demo = (Demo) context.getBean("demo");
        System.out.println(demo.getName());
    }
}
demo:
  a:
    - type: A
      prop1: 1
      prop2: 2
      proop3: 3
    - type: B
      prop1: 1
      prop2: 2
      proop3: 3
  b:
    - type: B
      prop1: 1
      prop2: 2
      proop3: 3
@SpringBootApplication
public class MainApplication {

    @Bean
    public ObjectMapper objectMapper() {
        return new ObjectMapper();
    }

    public static void main(String[] args) throws JsonProcessingException {
        ...
        ObjectMapper objectMapper = (ObjectMapper) context.getBean("objectMapper");
        System.out.println(objectMapper.writeValueAsString(demo));
    }
}
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.0.1</version>
</dependency>
 类似资料:
  • 我有一个camel应用程序,它使用SSH私钥连接到SFTP服务器。如果我从文件中读取id_rsa文件,我就能够连接到服务器。如本例所示,它正在从文件加载。 我想在运行时动态地提供私钥。这意味着在应用中。spring boot应用程序中的yaml,将由docker容器环境变量替换。 我得到了这个例外 经过一些调试,我明白这是的问题。如果我从文件中读取,则私钥包含\n个字符。但是如果我从. yaml文

  • 我正在读取google appengine应用程序中文件夹(/war/config/client.properties)中的属性文件。它在我的本地服务器上运行良好,但在生产模式下不工作,并且抛出异常java。安全AccessControlException:拒绝访问(java.io.FilePermission)。 你能告诉我如何在生产模式下工作吗。

  • 在启动我的spring boot应用程序时,我希望使用命令行参数设置自定义配置文件路径,例如: 那么如何读取这个文件来生成spring配置呢?我可以以某种“动态”方式使用注释吗?

  • 问题内容: 我对spring / java相当陌生,并且一直在为我正在工作的项目检查spring- boot。我一直在遵循指南,最后有一个(半)运行中的Web应用程序MVC + JPA用于数据访问。当我通过Jar方法部署应用程序时,一切正常: 但是,我们的应用程序最终将部署到Tomcat(v7.0.40),因此我需要从项目中创建一个war文件。我已经在spring.io网站上遵循了将jars转换为

  • src/main/resources/application.properti 为了完整起见,这里是build.gradle: 我构建应用程序:

  • 我们有两个配置文件:一个在Spring Boot应用程序(application.properties)中,另一个在ReactJs应用程序(我们在create-react-app中使用.env)中。决定在ReactJs应用程序中也使用Spring Boot application.properties。有谁能指导我如何才能做到这一点吗?我读过关于“Properties-Reader”的文章,并尝试