Spring Boot:使用@Value或@ConfigurationProperties从yaml读取列表

时间:2015-10-27 13:52:53

标签: spring configuration spring-boot yaml snakeyaml

我想从yaml文件(application.yml)中读取一个主机列表,该文件如下所示:

cors:
    hosts:
        allow: 
            - http://foo1/
            - http://foo2/
            - http://foo3/

(例1)

我使用的类定义了这样的值:

@Value("${cors.hosts.allow}")   
List<String> allowedHosts;

但是,当Spring抱怨这一点时,阅读失败了:

  

java.lang.IllegalArgumentException:无法解析占位符   &#39; cors.hosts.allow&#39;在字符串值&#34; $ {cors.hosts.allow}&#34;

当我像这样更改文件时,可以读取属性,但自然它不包含列表但只包含一个条目:

cors:
    hosts:
        allow: http://foo1, http://foo2, http://foo3

(我知道我可以将这些值作为一行读取并按","分割,但我不想再找一个解决方法了)

这也不起作用(虽然我认为根据snakeyamls docs这应该是有效的):

cors:
    hosts:
        allow: !!seq [ "http://foo1", "http://foo2" ] 

(跳过!!seq并仅使用[ / ]也是失败的)

我阅读了here的建议,其中涉及使用@ConfigurationProperties并将示例转移到Java并将其与您在Example1中看到的yaml文件一起使用:

@Configuration
@EnableWebMvc
@ConfigurationProperties(prefix = "cors.hosts")
public class CorsConfiguration extends WebMvcConfigurerAdapter {
    @NotNull
    public List<String> allow;
...

当我这样做时,我得到了这个抱怨:

  

org.springframework.validation.BindException:   org.springframework.boot.bind.RelaxedDataBinder $ RelaxedBeanPropertyBindingResult:   1个错误对象&#39; cors.hosts&#39;中的字段错误在现场&#39;允许&#39;:拒绝   值[null];代码[NotNull.cors.hosts.allow,NotNull.allow,NotNull];   参数   [org.springframework.context.support.DefaultMessageSourceResolvable:   代码[cors.hosts.allow,允许];争论者[];默认消息   [允许]];

我搜索了其他方法让我的CORS主机可配置并找到Spring Boot issue,但由于尚未完成,我无法将其用作解决方案。 所有这些都是通过Spring Boot 1.3 RC1完成的。

4 个答案:

答案 0 :(得分:3)

很简单,答案就在doc以及this one

所以,你有这样一个yaml:

-(BOOL)deleteElementWithHead:(ListNode*)headNode andNodeToDelete:(ListNode*)deleteNode{

    if (!head || !deleteNode) {
        return FALSE;
    }
    ListNode *element = head;

    if (deleteNode == head) {
        ListNode *temp;
    temp = element.next;
    head = nil;
    head = temp;
    return TRUE;
    }

    while (element) {
        if (element.next == deleteNode) {
            element.next = deleteNode.next;//set the pointer for element to the node to delete's "next" property so it points to the next one in the list
            deleteNode = nil;
            return TRUE;
        }
        element = element.next;
    }

    return FALSE;
}

然后首先绑定数据

cors:
    hosts:
        allow: 
            - http://foo1/
            - http://foo2/
            - http://foo3/

然后在另一个组件中你做

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
@ConfigurationProperties(prefix="cors.hosts")
public class AllowedHosts {
    private List<String> HostNames; //You can also bind more type-safe objects
}

你完成了!

答案 1 :(得分:3)

在application.yml中使用逗号分隔值

corsHostsAllow: http://foo1/, http://foo2/, http://foo3/

用于访问的java代码

@Value("${corsHostsAllow}")    
String[] corsHostsAllow

我尝试过并且成功了;)

答案 2 :(得分:1)

我已经能够从以下方式读取列表 -

属性 -

cors.hosts.allow[0]=host-0
cors.hosts.allow[1]=host-1

阅读资产 -

@ConfigurationProperties("cors.hosts")
public class ReadProperties {
    private List<String> allow;

    public List<String> getAllow() {
       return allow;
    }
    public void setAllow(List<String> allow) {
        this.allow = allow;
    }
}

答案 3 :(得分:0)

我遇到了同样的问题,但是解决了,给我我的解决方法

exclude-url: >
  /management/logout,
  /management/user/login,
  /partner/logout,
  /partner/user/login

Spring boot 2.1.6.RELEASE版本中的成功