Spring Boot - 从 Application.properties 填充列表/集合?

Posted

技术标签:

【中文标题】Spring Boot - 从 Application.properties 填充列表/集合?【英文标题】:Spring Boot - Populate List/Collection from Application.properties? 【发布时间】:2016-09-29 21:03:19 【问题描述】:

这可能是一个愚蠢的问题,但是否可以在 Spring Boot 中从 application.properties 文件中填充列表。这是一个简单的例子:

public class SomeClass 
    @Value("$hermes.api.excluded.jwt")
    private List<String> excludePatterns = new ArrayList<>();
    // getters/settings ....

application.properties

// Is something along these lines possible????
hermes.api.excluded.jwt[0]=/api/auth/
hermes.api.excluded.jwt[1]=/api/ss/

我知道我可以分解逗号分隔的字符串,但我只是好奇是否有原生的 spring boot 方法来做到这一点?

【问题讨论】:

你试过了吗?似乎尝试这个比写一个问题花费的时间更少:) 是的,如果可能的话我不知道属性文件中的秘密语法,我的问题只是使用了我认为很明显的东西,我得到....引起:org.springframework.beans .factory.BeanCreationException:无法自动装配字段:私有 java.util.List com.cwssoft.reportout.filter.JwtFilter.excludePatterns;嵌套异常是 java.lang.IllegalArgumentException:无法解析字符串值“$hermes.api.excluded.jwt”中的占位符“hermes.api.excluded.jwt” 我猜是***.com/questions/12576156/… 这令人惊讶,我原以为有一种更简洁的方法(与简单的 string.split 相比),因为它在 applicationContext 文件中很常见。谢谢 哦,github.com/spring-projects/spring-boot/issues/… 您不必拆分,现在在启动时显然已默认启用。 + YAML 似乎支持您的语法:docs.spring.io/spring-boot/docs/current/reference/html/… 【参考方案1】:

事实证明它确实有效。但是,您似乎必须使用配置属性,因为简单的@Value("$prop") 似乎在后台使用了不同的路径。 (this secion 中对DataBinder 有一些提示。不确定是否相关。)

application.properties

foo.bar[0]="a"
foo.bar[1]="b"
foo.bar[2]="c"
foo.bar[3]="d"

在代码中

@Component
@ConfigurationProperties(prefix="foo")
public static class Config 
    private final List<String> bar = new ArrayList<String>();
    public List<String> getBar() 
        return bar;
    


@Component
public static class Test1 
    @Autowired public Test1(Config config) 
        System.out.println("######## @ConfigProps " + config.bar);
    

结果

######## @ConfigProps ["a", "b", "c", "d"]

虽然

@Component
public static class Test2 
    @Autowired public Test2(@Value("$foo.bar") List<String> bar) 
        System.out.println("######## @Value " + bar);
    

结果

java.lang.IllegalArgumentException: Could not resolve placeholder 'foo.bar' in string value "$foo.bar"
    at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(...
    ...

【讨论】:

以上是关于Spring Boot - 从 Application.properties 填充列表/集合?的主要内容,如果未能解决你的问题,请参考以下文章

升级到最新版本时 Spring Boot 国际化不起作用

在 Spring Boot 应用程序中使用 JSP 和 Thymeleaf 视图

spring boot项目application.properties多环境配置文件jar包外部配置文件

Spring Boot - CORS 过滤器适用于 GET,但不适用于其他 HTTP 动词

如何确保在 Apache Tomcat 中运行的 Spring Boot 应用程序中替换了环境变量占位符?

SpringBoot报错:Failed to load ApplicationContext(javax.websocket.server.ServerContainer not available)