亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何從 spring-boot 應用程序中的 application.yml 文件讀取屬性

如何從 spring-boot 應用程序中的 application.yml 文件讀取屬性

胡說叔叔 2023-08-16 09:51:42
我的應用程序將嵌套屬性存儲在 application.yml 文件中。我想在應用程序啟動時將這些屬性映射到POJO 。應用程序.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 + "]";    }   }
查看完整描述

4 回答

?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

當您手動創建屬性 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您可以創建一個 bean,而不是使用 注釋配置Demo,如類型安全配置屬性中所示。


@Component

@ConfigurationProperties("demo")

public class Demo {

    ...

}

然后你可以Demo從上下文中獲取 bean:


@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());

    }

}

UPD: “a”和“b”之前不能有連字符:


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

UPD2:回答評論。Demo您可以使用以下方法從 bean構建 JSON ObjectMapper:


@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));

    }

}

不需要spring-boot-starter-web額外的依賴。否則,你可以添加jackson:


<dependency>

    <groupId>com.fasterxml.jackson.core</groupId>

    <artifactId>jackson-databind</artifactId>

    <version>2.0.1</version>

</dependency>


查看完整回答
反對 回復 2023-08-16
?
慕碼人2483693

TA貢獻1860條經驗 獲得超9個贊

您的文件中的內容不正確。您yml可以在此處閱讀鏈接上的Merging YAML lists參考。


我寫了一個演示,它可以工作。


demo:

        a:

            b:

                prop1: prop1

                prop2: prop2

            blist:

                - prop1: prop1

                  prop2: prop2

        alist:

            - b:

                  prop1: prop1

                  prop2: prop2

              blist:

                  - prop1: prop1

                    prop2: prop2

            - b:

                  prop1: prop1

                  prop2: prop2

``


@ConfigurationProperties(prefix = "demo")

public class Demo {

    private A a;

    private List<A> alist;

    // omitted getter/setter

}

``


public class A {

    private B b;

    private List<B> blist;

    // omitted getter/setter

}

``


public class B {

    private String prop1;

    private String prop2;

    // omitted getter/setter

}


查看完整回答
反對 回復 2023-08-16
?
慕哥9229398

TA貢獻1877條經驗 獲得超6個贊

如果您想從.yml或.properties文件讀取屬性,我建議您創建一個類,可以PropertiesBooter在其中保存從這些文件檢索到的所有值。要從屬性文件中檢索值,您可以編寫


@Value("${value}")

private String 


查看完整回答
反對 回復 2023-08-16
?
炎炎設計

TA貢獻1808條經驗 獲得超4個贊

從 Mikhail 的回答中,只需使用 Jackson ObjectMapper 編寫 json,即可獲得 json 格式:


public static void main(String[] args) {

        ConfigurableApplicationContext context = SpringApplication.run(YamlTestApplication.class, args);

        Demo demo = (Demo) context.getBean("demo");

        System.out.println("name: " + demo);


        ObjectMapper mapper = new ObjectMapper();

        try {

            String test = mapper.writeValueAsString(demo);

            System.out.println("json: "+test);

        } catch (JsonProcessingException e) {

            e.printStackTrace();

        }

    }

輸出:


name: Demo [a=[A [type=A, prop1=1, prop2=2, proop3=3], A [type=B, prop1=1, prop2=2, proop3=3]], b=[B [type=A, prop1=1, prop2=2, proop3=3], B [type=B, prop1=1, prop2=2, proop3=3]]]

json: {"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}]}



查看完整回答
反對 回復 2023-08-16
  • 4 回答
  • 0 關注
  • 211 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號