Сбой инициализации компонента по условию после обновления версии загрузки spring до 2.0.1.

Невозможно запустить проект после обновления родительской версии spring-boot-starter с 1.5.9.РЕЛИЗ до 2.0.1.РЕЛИЗ. Было обнаружено, что когда у нас есть метод условной инициализации bean-компонента, приложение не запускается.

pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <!-- Previous version -->
    <!-- <version>1.5.9.RELEASE</version> -->
    <!-- Updated version -->
    <version>2.0.1.RELEASE</version>
    <relativePath />
</parent>

application.properties

host.enabled=false 

DemoApplication.java

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

DemoClass.java

@Component
@EnableScheduling
public class DemoClass {

    @Value("${host.enabled}")
    private boolean enableHostName;

    @Bean(name = "hostName")
    public String getName() {
        try {
            if(enableHostName)
                return InetAddress.getLocalHost().getHostName();
        } catch (UnknownHostException e) {
            return "Unknown";
        }
        return null;
        //return "";
    }

    @Autowired
    @Qualifier("hostName")
    String hostName;

    @Scheduled(fixedRate = 3000)
    public void print(){
        System.out.println(hostName);
    }
}

Журнал консоли:

2018-04-11 17:59:32.584  WARN 24120 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'demoClass': Unsatisfied dependency expressed through field 'hostName'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.lang.String' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=hostName)}
2018-04-11 17:59:32.592  INFO 24120 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2018-04-11 17:59:32.620  INFO 24120 --- [           main] ConditionEvaluationReportLoggingListener : 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2018-04-11 17:59:32.917 ERROR 24120 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************
Description:
Field hostName in com.vjs.demo.DemoClass required a bean of type 'java.lang.String' that could not be found.

Action:
Consider defining a bean of type 'java.lang.String' in your configuration.
0
0
586
1

Ответы 1

См. Здесь, в весенней загрузке 2.01 не допускается автоматическое подключение Null beans

потому что в вашем файле свойств установлено значение false, поэтому компонент @Bean(name = "hostName") всегда будет возвращать пустую строку,

Изменение значения возврата на пустой или sipmle решит проблему.

нравиться

@Bean(name = "hostName")
public String getName() {
    try {
        if(enableHostName)
            return InetAddress.getLocalHost().getHostName();
    } catch (UnknownHostException e) {
        return "Unknown";
    }
    return "Host name not enabled";
}

Другие вопросы по теме