用列表类型覆盖@ConfigurationProperties 中的setter
Override setter in @ConfigurationProperties with list type
我正在使用 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 调用之后为列表注入正确的值。
这是正确的行为吗?我试图在文档中找到任何参考,但找不到任何东西。
有什么办法可以解决这个问题吗?
非常感谢。
它是否正确是有争议的,正如您所注意到的,这就是发生的事情。
如果您只有一小部分权限(比如少数),最简单的解决方案是只拥有 getter return
return Sets.newHashset(permissions)
之类的。在大多数情况下,性能缺陷无关紧要。
如果您担心性能问题,您可以将 permissionsSet
初始化为 null
并在第一次使用 getter 时正确初始化它(即从 permissions
初始化它,如果它为空)。
或者,您可以尝试 @PostConstruct
(请参阅 here 了解官方文档)或其他选项以在构造后使用自定义代码初始化 bean permissionSet
,但我会考虑一下这个例子的矫枉过正。
我正在使用 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 调用之后为列表注入正确的值。
这是正确的行为吗?我试图在文档中找到任何参考,但找不到任何东西。
有什么办法可以解决这个问题吗?
非常感谢。
它是否正确是有争议的,正如您所注意到的,这就是发生的事情。
如果您只有一小部分权限(比如少数),最简单的解决方案是只拥有 getter return
return Sets.newHashset(permissions)
之类的。在大多数情况下,性能缺陷无关紧要。
如果您担心性能问题,您可以将 permissionsSet
初始化为 null
并在第一次使用 getter 时正确初始化它(即从 permissions
初始化它,如果它为空)。
或者,您可以尝试 @PostConstruct
(请参阅 here 了解官方文档)或其他选项以在构造后使用自定义代码初始化 bean permissionSet
,但我会考虑一下这个例子的矫枉过正。