温馨提示:本文翻译自stackoverflow.com,查看原文请点击:java - Override setter in @ConfigurationProperties with list type
java spring spring-boot configurationproperties

java - 使用列表类型覆盖@ConfigurationProperties中的setter

发布于 2020-03-29 21:59:55

我正在使用Spring Boot 1.5.15,在读取带有注释的bean时遇到一些麻烦@ConfigurationProperties

详细地说,我正在尝试使用以下bean。

@ConfigurationProperties(prefix = "permissions")
public class Permissions {
    private List<String> permissions;
    private Set<String> permissionsSet;

    public List<String> getPermissions() {
        return this.permissions;
    }

    public void setPermissions(List<String> permissions) {
        this.permissionsSet = new HashSet<>(permissions)
        this.permissions = permissions;
    }

    // Other code
}

相应application.yml的如下。

permissions:
  permissions:
    - ROLE_1
    - ROLE_2

我面临的问题是该成员permissionsSet始终为空。我调试了该应用程序,发现Spring使用以下工作流来创建Bean。

  1. 默认构造函数调用
  2. 二传手用空列表调用
  3. 在setter调用后为列表注入正确的值。

这是正确的行为吗?我想在文档中找到任何参考,但找不到任何东西。

有什么办法解决这个问题?

非常感谢。

查看更多

提问者
riccardo.cardin
被浏览
200
Frank Hopkins 2020-01-31 23:56

正如您所注意到的,是否正确尚有争议,这就是发生的事情。

如果您只有少量权限(例如少数),最简单的解决方案是让getter返回

return Sets.newHashset(permissions) 

或类似的东西。在大多数情况下,性能缺陷并不重要。

如果您担心性能问题,则可以将permissionsSetas null初始化为第一次使用getter并正确对其进行初始化(即从permissionsnull开始对其进行初始化)。

另外,您可以尝试@PostConstruct(参见此处以获取官方文档)或其他选项,以在构造后使用自定义代码来初始化Bean permissionSet,但是对于该示例,我认为这过于刻板。