1

我正在使用Spring Boot 1.5.15,并且在读取带有 annotation 的 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. 使用空列表调用 Setter
  3. 在 setter 调用后为列表注入正确的值。

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

有没有办法解决这个问题?

非常感谢。

4

1 回答 1

1

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

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

return Sets.newHashset(permissions) 

或类似的。在大多数情况下,性能缺陷无关紧要。

如果您担心性能问题,您可以在第一次使用 getter 时初始化permissionsSetnull并正确初始化它(即,permissions如果它为 null,则从它开始初始化)。

或者,您可以尝试@PostConstruct(有关官方文档,请参见此处)或其他选项在构造后使用自定义代码来初始化 bean 来初始化permissionSet,但我认为这个例子有点过分了。

于 2020-01-31T11:06:13.597 回答