我正在使用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。
- 默认构造函数调用
- 使用空列表调用 Setter
- 在 setter 调用后注入(inject)正确的列表值。
这是正确的行为吗?我试图在文档中查找任何引用,但找不到任何内容。
有什么办法可以解决这个问题吗?
非常感谢。
最佳答案
这是否正确是有争议的,正如你所注意到的,这就是发生的事情。
如果您只有一小部分权限(比如少数),最简单的解决方案就是让 getter 返回
return Sets.newHashset(permissions)
或类似的。在大多数情况下,性能缺陷并不重要。
如果您担心性能问题,可以初始化 permissionsSet
如null
并在第一次使用 getter 时正确初始化它(即,如果它为空,则从 permissions
初始化它)。
或者,您可以尝试@PostConstruct
(请参阅 here 获取官方文档)或使用自定义代码构造后初始化 bean 的其他选项以初始化 permissionSet
,但我认为对于这个例子来说这有点过分了。
关于java - 使用列表类型覆盖 @ConfigurationProperties 中的 setter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60002503/