当前位置: 首页 > 知识库问答 >
问题:

@ConfigurationProperties设置

蒙弘图
2023-03-14

我想在启动时Spring加载一些属性并将它们转换为正确的类型。

应用yml:

base:
  security:

    scopes:
      - name: read
        descripton: read some nice things

      - name: write
        description: write some nice things

    authorities:
      - name: ROLE_ADMIN
        scopes:
          - read
          - write

      - name: ROLE_USER
        scopes:
          - read 

为了将这些属性加载到类型中,我使用了以下@ConfigurationProperties:BaseProperties。Java语言

@Setter
@Getter
@Configuration
@ConfigurationProperties(prefix="base.security")
public class BaseProperties {

    private Set<ScopeProperty> scopes = new HashSet<>();
    private Set<AuthorityProperty> authorities = new HashSet<>();

    @Getter
    @Setter
    public class AuthorityProperty {
        private String name;
        private List<String> scopes;
    }

    @Getter
    @Setter
    public class ScopeProperty {
        private String name;
        private String description;
    }
}

我得到的一切都是一个BindException,如下所示:

Caused by: org.springframework.boot.context.properties.bind.UnboundConfigurationPropertiesException: The elements [base.security.authorities[0].name,base.security.authorities[0].scopes[0],base.security.authorities[0].scopes[1],base.security.authorities[1].name,base.security.authorities[1].scopes[0]] were left unbound.
    at org.springframework.boot.context.properties.bind.IndexedElementsBinder.assertNoUnboundChildren(IndexedElementsBinder.java:136)
    at org.springframework.boot.context.properties.bind.IndexedElementsBinder.bindIndexed(IndexedElementsBinder.java:113)
    at org.springframework.boot.context.properties.bind.IndexedElementsBinder.bindIndexed(IndexedElementsBinder.java:86)
    at org.springframework.boot.context.properties.bind.IndexedElementsBinder.bindIndexed(IndexedElementsBinder.java:71)
    at org.springframework.boot.context.properties.bind.CollectionBinder.bindAggregate(CollectionBinder.java:49)
    at org.springframework.boot.context.properties.bind.AggregateBinder.bind(AggregateBinder.java:56)
    at org.springframework.boot.context.properties.bind.Binder.lambda$bindAggregate$2(Binder.java:293)
    at org.springframework.boot.context.properties.bind.Binder$Context.withIncreasedDepth(Binder.java:429)
    at org.springframework.boot.context.properties.bind.Binder$Context.access$100(Binder.java:372)
    at org.springframework.boot.context.properties.bind.Binder.bindAggregate(Binder.java:293)
    at org.springframework.boot.context.properties.bind.Binder.bindObject(Binder.java:254)
    at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:214)

解决方案:

将类标记为静态类或将其创建为单独的类:

    @Getter
    @Setter
    public static class AuthorityProperty {
        private String name;
        private List<String> scopes;
    }

    @Getter
    @Setter
    public static class ScopeProperty {
        private String name;
        private String description;
    }

共有2个答案

乐正晟
2023-03-14

我刚刚找出了这个问题的原因。spring似乎无法通过内部类声明属性集的类型来处理这一问题。我将这些类提取到单独的类中,但它不起作用。

鲁展
2023-03-14

类是内部类,需要构造外部类BaseProperties的实例,而Spring属性不支持这种情况。

您可以使用关键字静态标记您的类,这应该可以工作

@Getter
@Setter
public static class AuthorityProperty {
    private String name;
    private List<String> scopes;
}
 类似资料:
  • 我正在开发一个Spring集成/引导应用程序。我正在使用一个多文档(src/main/Resources/application.yml)来设置几个配置类的默认值(用@ConfigurationProperties注释)。pplicaiton.yml带有默认值,其中一些需要被覆盖,具体取决于环境。 我可以在目录中使用Java系统属性(-D...=...)、Spring“属性”(--...=...)

  • 我试过各种组合。如果我将注释更改为,我不会得到错误,但为空。 救命啊!!

  • 是否可以使用Spring Boot的注释具有不可变(最终)字段?下面的例子 到目前为止我尝试过的方法: 使用两个构造函数创建MyProps类的 提供两个构造函数:空和参数 bean是用创建的 结果字段为null 导致- 我让它工作的唯一方法是为每个非最终字段提供getter/setter。

  • 我有一个通过ConfigurationProperties配置的bean: 我通过但在“两级”中。在默认应用程序中。yml我只是将值设置为另一个属性的值: 在配置文件特定的YML文件中,我有: 我的期望是,如果我忘记指定属性,那么应用程序将在启动时失败,并显示占位符theValueOf.myBean.name无法解析的消息。相反,字段被分配了值(字面意思)。 如果我用注释字段(并且不要使用Conf

  • 我的财产包括: 我的申请。属性,如: 测试是: 故障原因: 我尝试过很多事情,比如: 添加SpringBootTest将PropertySource替换为 TestPropertySource测试属性源 Spring开机版本为:2.2.2。释放 有人有主意吗?