Spring Boot 2.x 列表绑定问题

Posted

技术标签:

【中文标题】Spring Boot 2.x 列表绑定问题【英文标题】:Spring Boot 2.x list binding issues 【发布时间】:2018-11-18 20:52:54 【问题描述】:

升级到 Spring Boot 2x 后,我遇到了绑定某些列表的问题。该代码在 Spring 1.x 中工作,现在它在启动时引发绑定错误。这是我的 application.yml...

aws:
  geo-mappings:
    - name: USA
      regions:
        - us-west-2
        - us-west-1
        - us-east-1
        - us-east-2
    - name: California
      regions:
        - us-west-2

这是我的组件类...

package com.example.demo.config.aws;


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

import java.util.ArrayList;
import java.util.List;

/**
 * Created by goer on 4/18/17.
 */
@Component
@Scope("singleton")
@ConfigurationProperties(prefix="aws")
public class AWSConfigProvider 

    private List<GeoMappingEntry> geoMappings = new ArrayList<>();

    public List<GeoMappingEntry> getGeoMappings() 
        return this.geoMappings;
    



这是嵌套对象...

package com.example.demo.config.aws;

import java.util.ArrayList;
import java.util.List;


public class GeoMappingEntry 
    private String name;
    private List<String> regions = new ArrayList<>();

    public GeoMappingEntry(String name, List<String> regions) 
        this.name = name;
        this.regions = regions;
    

当我尝试跑步时,我得到...


应用程序启动失败


说明:

无法将“aws.geo-mappings”下的属性绑定到 java.util.List:

Reason: Failed to bind properties under 'aws.geo-mappings' to java.util.List<com.example.demo.config.aws.GeoMappingEntry>

行动:

更新应用程序的配置

还有其他人遇到过同样的问题吗?解决方案?有什么建议吗?

【问题讨论】:

我想说你的name 字段需要一个setter。已初始化的集合不需要 setter,但未初始化的字段可能需要一个。 可能是2.0.1中修复的错误 我希望。我使用最新版本 2.0.2 创建了一个简化项目,但它无法正常工作。我怀疑新的绑定实现对某些东西有更严格的限制并造成了问题。 【参考方案1】:

以防万一其他人正在研究类似的问题。事实证明,一些在以前版本的 Spring 中不起作用的环境变量现在能够实际创建绑定,这就是错误的来源。

在这种情况下,从环境变量到 AWS_GEOMAPPINGS_0_REGIONS_0 = us-west-2 等列表的宽松绑定以前不起作用,但现在可以了。在 Spring Boot 2.0 之前,从环境变量中设置它的唯一方法是通过 SPRING_APPLICATION_JSON 传递 JSON,这有效,但如果您尝试使用封装它的其他 JSON(如 Terraform)进行部署,则会变得复杂。

【讨论】:

你能提供更多细节吗?例如,让未来的读者知道您正在谈论的环境变量是哪些环境变量......只是说出来。

以上是关于Spring Boot 2.x 列表绑定问题的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 2.x基础教程:使用@Scheduled实现定时任务

Java微信公众平台开发之生成带参二维码(Spring Boot 2.X)

Spring Boot 2.X 装载 yaml 配置文件的键值对

未绑定命名参数:Spring Boot 中的 DATE_FORMAT 本机查询

Spring Boot 学习例子

如何添加到 Thymeleaf/Spring Boot 发布请求中的子对象列表