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

标签 java spring spring-boot configurationproperties

我正在使用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 调用后注入(inject)正确的列表值。

这是正确的行为吗?我试图在文档中查找任何引用,但找不到任何内容。

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

非常感谢。

最佳答案

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

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

return Sets.newHashset(permissions) 

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

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

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

关于java - 使用列表类型覆盖 @ConfigurationProperties 中的 setter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60002503/

相关文章:

java - 为什么使用 "node.getNext( ) == null"作为失效节点的约定?

Java List 引用另一个 List 来修改自己

java - 变量名与对象类型相同?

java - com.google.appengine :appengine-api-1. 0-sdk:jar 的“dependency.dependency.version”必须是有效版本,但为 '${appengine.target.version}'

java.lang.ClassNotFoundException : org. slf4j.impl.StaticLoggerBinder 我什至没有登录我的依赖项

java - 将 msgpack 添加为 spring mvc + boot 的内容协商

mysql - spring boot + JPA + mysql,无法检索结果集

spring-boot - 架构域模型和 View 模型

java - 获取 HTTP 状态 404 -/hello/?

java - 从 WAR 文件中打包的类路径加载 PNG 文件