【问题标题】:Override setter in @ConfigurationProperties with list type使用列表类型覆盖 @ConfigurationProperties 中的 setter
【发布时间】:2020-01-31 10:54:11
【问题描述】:

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

具体来说,我正在尝试使用以下 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 调用后为列表注入正确的值。

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

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

非常感谢。

【问题讨论】:

  • 为什么不直接使用一组“权限”?
  • 因为 Spring 不允许将值直接注入 Set :(
  • 有趣,该功能似乎已在更高版本中添加,因为我见过这样做的代码。

标签: java spring spring-boot configurationproperties


【解决方案1】:

它是否正确值得商榷,正如您所注意到的,事情就是这样发生的。

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

return Sets.newHashset(permissions) 

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

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

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

【讨论】:

  • 这是一个玩具示例,而不是我使用的真实代码。感谢@PostConstruct 的提示,但我还要求提供一些文档。你有吗?
  • @riccardo.cardin 抱歉,我没有关于 ConfigurationProperties 注入实现的文档。添加了 PostConstruct 官方文档的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-21
  • 2015-09-12
  • 1970-01-01
  • 2015-11-02
  • 1970-01-01
相关资源
最近更新 更多