代码之家  ›  专栏  ›  技术社区  ›  phip1611

将ConfigurationProperties与内部类一起使用会导致“属性未绑定”异常

  •  0
  • phip1611  · 技术社区  · 4 年前

    我有一个 @ConfigurationProperties -注释 @Configuration -类调用 库配置 。它使用内部类作为属性/配置结构的类型定义。当类是内部类而不是独立类时,我会得到 “元素[…]未被绑定” 错误/异常。为什么会这样,我该怎么解决?

    application.yml

    initdata:
      library:
        name: awesome library
        books:
          - title: Book1
            author: Author Abc
          - title: Book2
            author: Author Xyz
    

    库配置.java

    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @ConfigurationProperties(prefix = "initdata.library")
    public class LibraryConfiguration {
        private String name;
        private List<Book> books;
    
        // getters left out for simplicity of example
        public void setName(String name) {
            this.name = name;
        }
        public void setBooks(List<Book> books) {
            this.books = books;
        }
    
        public LibraryConfiguration() {
        }
    
        public static class Book {
            private String title;
            private String author;
    
            public Book() {
            }
            // getters left out for simplicity of example
            public void setTitle(String title) {
                this.title = title;
            }
            public void setAuthor(String author) {
                this.author = author;
            }
        }
    }
    
    1 回复  |  直到 4 年前
        1
  •  0
  •   phip1611    4 年前

    您要么创建一个独立的类,要么必须将内部类声明为 static class ! 否则,Spring不会仅仅将其视为“类型定义”,而是试图创建它的实例——当然,这不适用于给定的 yml -配置。将代码更改为以下内容

    // ...
    public LibraryConfiguration() {
    }
    
    // This class MUST be static, otherwise Spring will tell "Elements [...] were left unbound".
    // If it's static, it's just a "type definition";
    // otherwise spring tries to create an insance
    public static class Book {
        private String title;
        private 
    // ...