首页 > 解决方案 > spring boot @EnableConfigurationProperties 标记内部类发生异常

问题描述

spring 5.1.9-RELEASE spring boot 2.1.7-RELEASE 当我有内部类要注册时,我在 A 类和 B 类上使用 @EnableConfigurationProperties 标记,此时发生异常;我去掉A类注解;此时启动成功;B类使用@EnableConfigurationProperties注册C,此时B也注册了,B类此时应该注册吗?但是当我将两个内部类移动到与TestConfiguration相同的路径时,A类和B类都必须注解@EnableConfigurationProperties才能完成启动

package com.test.configuration;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.test.configuration.TestConfiguration.TestConfigB;

import lombok.Data;

@Configuration
@EnableConfigurationProperties(TestConfigB.class)
public class TestConfiguration {

    @Bean
    @ConditionalOnMissingBean(TestConfigA.class)
    @ConditionalOnProperty(prefix = "test-a", name = "enable", havingValue = "true", matchIfMissing = true)
    public TestConfigA testConfigA(TestConfigB testConfigB) {
        return new TestConfigA();
    }

    @Data
    public class TestConfigA {
        private String name;
    }

    @Data
    @ConfigurationProperties(prefix = "test-b")
    @EnableConfigurationProperties(TestConfigC.class)
    public class TestConfigB {
        private String applicationId;

        @Autowired
        TestConfigC axxcConfig;

        public String getApplicationId() {
            if (applicationId == null) {
                applicationId = axxcConfig.getApplicationId();
            }
            return applicationId;
        }
    }

    @ConfigurationProperties(prefix = "test-c")
    public class TestConfigC implements ApplicationContextAware {
        private String applicationId;
        private ApplicationContext applicationContext;

        public String getApplicationId() {
            if (applicationId == null) {
                applicationId = applicationContext.getEnvironment().getProperty("spring.application.name");
            }
            return applicationId;
        }

        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            this.applicationContext = applicationContext;
        }

    }

}

标签: javaspring-boot

解决方案


您的@ConfigurationProperties类需要static这样才能独立于(之前)包含的配置类创建它们的副本。


推荐阅读