【问题标题】:How to define complex list for application yml in spring boot?如何在 Spring Boot 中为应用程序 yml 定义复​​杂列表?
【发布时间】:2017-01-05 01:01:54
【问题描述】:

假设我定义了这个application.yml

spring:
    profiles.active: development
---
spring:
    profiles: development
logging:
    level:
        org.springframework.web: DEBUG
        org.hibernate: ERROR
storage:
    RemoteStorage:
        name: "Server 1"
        user: "test"
        passwd: "test"
        host: "163.218.233.106"

    LocalStorage:
        name: "Server 2"
        user: "test2"
        passwd: "test2"
        host: "10.10.0.133"
---

storage 是一个自定义属性,我希望它像这样加载:

@Value("${storage}")
private List<Storage> AvailableStorage = new ArrayList<>();

抱歉,我是 Spring 框架的初学者。我试图做的是让RestController 根据请求提供的参数读取相应的配置,即像?storage=RemoteStorage 这样的请求将使用RemoteStorage 配置。

【问题讨论】:

    标签: java spring spring-mvc spring-boot yaml


    【解决方案1】:

    @Value 注释不会加载列表或映射类型的属性。为此,您必须使用 @ConfigurationProperties 注释定义一个类,如下所示。

    import java.util.List;
    import java.util.Map;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @ConfigurationProperties(prefix ="storage")
    public class MyProps {
    
    private List<String> listProp;
    private Map<String, String> mapProp;
    
    public List<String> getListProp() {
        return listProp;
    }
    public void setListProp(List<String> listProp) {
        this.listProp = listProp;
    }
    public Map<String, String> getMapProp() {
        return mapProp;
    }
    public void setMapProp(Map<String, String> mapProp) {
        this.mapProp = mapProp;
       }
    }
    

    下面是上述属性配置类的application.yaml文件。

    storage:
    listProp:
        - listValue1
        - listValue2
    mapProp:
        key1: mapValue1
        key2: mapValue2
    

    如果您使用的是 application.properties 文件而不是 .yaml 文件,那么

    storage.listProp[0]=listValue1
    storage.listProp[1]=listValue2
    storage.mapProp.key1=mapValue1
    storage.mapProp.key2=mapValue2
    

    【讨论】:

    • 所以为了在 yml 中定义多个服务器。我不能像问题中的那样定义它。相反,我需要一个列表作为指向不同mapProp 的指针?从您的示例看来,我必须为MyProps 中的多个服务器定义有些模棱两可的getMapProp1getMapProp2 等。
    • .yaml 条目不过是属性键值。请检查上面。我已经添加了在 application.properties 的情况下条目的外观。因此,在您的情况下,您将定义 localStorage 和 remoteStorage 映射。如果要根据环境加载 bean,则可以使用 @ConditionalOnProperty。检查docs.spring.io/spring-boot/docs/current/reference/html/…
    • 嗯,我认为有一种方法可以将值映射到类。但这很好,我仍然可以用你的方法自己映射它。谢谢:)
    猜你喜欢
    • 2017-11-16
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 2021-09-27
    • 2016-07-17
    • 2018-10-27
    • 2021-12-27
    相关资源
    最近更新 更多