ing 发表于 2019-7-15 07:47

SpringBoot 使用Collections.singleton 过滤yml文件的值未生效

本帖最后由 ing 于 2019-7-15 09:08 编辑

我想的结果应该是只有"User"被输出



实际输出结果 Roles:


这是因为什么?



第2张图的完整代码
@Component
@ConfigurationProperties(prefix = "acme")
public class AcmeProperties {
    private boolean enabled;
    private String remoteAddress;
    private final Security security = new Security();

    public boolean isEnabled() {
      return enabled;
    }

    public void setEnabled(boolean enabled) {
      this.enabled = enabled;
    }

    public String getRemoteAddress() {
      return remoteAddress;
    }

    public void setRemoteAddress(String remoteAddress) {
      this.remoteAddress = remoteAddress;
    }

    public Security getSecurity() {
      return security;
    }

    public static class Security{
      private String username;
      private String password;
      private List<String> roles = new ArrayList<>(Collections.singleton("USER"));

      public String getUsername() {
            return username;
      }

      public void setUsername(String username) {
            this.username = username;
      }

      public String getPassword() {
            return password;
      }

      public void setPassword(String password) {
            this.password = password;
      }

      public List<String> getRoles() {
            return roles;
      }

      public void setRoles(List<String> roles) {
            this.roles = roles;
      }
    }
}

参考https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-typesafe-configuration-properties

Vvvvvoid 发表于 2019-7-15 09:31

ArrayList 的这个构造
实际上 是把singleList 遍历扔到 arrayList 中
而在SpringBoot 配置注入的时候 arrayList 以及有俩值了,

维C糖果 发表于 2019-7-15 08:23

代码不全。。。。看不到怎么解析的{:17_1062:}

ing 发表于 2019-7-15 09:01

维C糖果 发表于 2019-7-15 08:23
代码不全。。。。看不到怎么解析的

补上输出的图了

jihousai 发表于 2019-7-15 09:08

你把 new ArrayList<>(Collections.singleton("USER")); 中的 USER 换成 GUEST 试试就明白了。
另外 Collections.singleton("USER") 返回的是一个 SingletonSet , 这个 Set 中只有一个元素,而不是 List 只有一个元素。

浅唱、聆听 发表于 2019-7-15 09:10

本帖最后由 浅唱、聆听 于 2019-7-15 09:11 编辑

你可以先看看在构造时
private List<String> roles = new ArrayList<>(Collections.singleton("USER"));
用这里的Collections.singleton("USER")单独声明一个变量 看看有什么元素在里面

VioletKiss 发表于 2019-7-15 09:19

是因为admin有ADMIN和USER的权限?所以被打印出来了?我瞎猜的

丶夜雨 发表于 2019-7-15 10:15

配置文件里面的Roles,把USER,ADMIN改成什么值,输出的就是什么值

ing 发表于 2019-7-15 10:52

Vvvvvoid 发表于 2019-7-15 09:31
ArrayList 的这个构造
实际上 是把singleList 遍历扔到 arrayList 中
而在SpringBoot 配置注入的时候 ar ...

把singleList 遍历扔到 arrayList 中赋值的话不应该是只有一个值吗?虽然程序执行后确实是2个但我有点不理解

ing 发表于 2019-7-15 10:55

Vvvvvoid 发表于 2019-7-15 09:31
ArrayList 的这个构造
实际上 是把singleList 遍历扔到 arrayList 中
而在SpringBoot 配置注入的时候 ar ...

这是我对
private List<String> roles = new ArrayList<>(Collections.singleton("USER"));
执行顺序的理解

Collections.singleton("USER")>new ArrayList<>()

由于singleton的值只有一个
所以new ArrayList执行的时候也只有一个。。。
页: [1] 2
查看完整版本: SpringBoot 使用Collections.singleton 过滤yml文件的值未生效