Spring Boot @ComponentScan находит потенциальный класс компонента, но не внедряет компоненты @Configuration - PullRequest
1 голос
/ 13 февраля 2020

У меня есть @SpringBootApplication с @ComponentScan({"myPackage"}) и в myPackage У меня есть класс, помеченный @Configuration или @Component. Когда я запускаю приложение весенней загрузки, журналы показывают:

DEBUG [main] org.sprin.conte.annot.ClassPathScanningCandidateComponentProvider 437 scanCandidateComponents: Identified candidate component class: file [C:\Web\project\bin\main\myPackage\Config.class]

, но тогда ничто не добавляет класс или его компоненты в приложение ...

Похоже, что this

КОД

package app;

import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.gemfire.config.annotation.EnableLogging;
import org.springframework.data.gemfire.repository.config.EnableGemfireRepositories;

@SpringBootApplication
@ComponentScan({"myPackage"})
@EntityScan({"myPackage"})
@EnableGemfireRepositories("region") 
@EnableLogging(logLevel="info", logFile="geodeApi.log")
public class Web {

    private static final Logger log = LogManager.getLogger(Web.class);

    public static void main(String[] args) {
        log.info("In Main");

        SpringApplication app = new SpringApplication(Web.class);
        app.setWebApplicationType(WebApplicationType.REACTIVE);
        SpringApplication.run(Web.class, args);

        log.info("Out Main");
    }
}

В myPackage.Client

package myPackage;

import java.util.UUID;

import javax.annotation.PreDestroy;
import javax.annotation.Resource;

import org.apache.logging.log4j.Logger;
import org.apache.geode.cache.Region;
import org.apache.geode.cache.client.ClientRegionShortcut;
import org.apache.logging.log4j.LogManager;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.data.gemfire.cache.config.EnableGemfireCaching;
import org.springframework.data.gemfire.config.annotation.ClientCacheApplication;
import org.springframework.data.gemfire.config.annotation.EnableClusterDefinedRegions;
import org.springframework.data.gemfire.config.annotation.EnablePdx;
import org.springframework.data.gemfire.config.annotation.EnablePool;
import org.springframework.data.gemfire.config.annotation.EnablePool.Locator;
import org.springframework.data.gemfire.config.annotation.EnableStatistics;
import org.springframework.session.data.gemfire.config.annotation.web.http.EnableGemFireHttpSession;

@ClientCacheApplication(name = "Web", logLevel = "debug")
@EnablePool(name = "webPool", subscriptionEnabled = true)
@EnableClusterDefinedRegions(clientRegionShortcut=ClientRegionShortcut.CACHING_PROXY)
@EnablePdx
@EnableStatistics
@EnableGemFireHttpSession(poolName = "webPool")
@EnableGemfireCaching
// @EnableWebFlux
public class Client {

    private static final Logger log = LogManager.getLogger(Client.class);

    @Resource
    private Region<String, String> myAdmin;

    @PreDestroy
    public void onDestroy() throws Exception {

        log.info("onDestroy");

        String guid = UUID.randomUUID().toString().substring(0, 8).toUpperCase();           
        myAdmin.put(guid, "Web Shutdown");

        log.traceExit();
    }

    @Bean
    ApplicationRunner StartedUp(){      
        log.traceEntry("StartedUp");

        return args -> {            
        String guid = UUID.randomUUID().toString().substring(0, 8).toUpperCase();       
        myAdmin.put(guid, "Web Started");

        log.traceExit();
        };
    }

    // Required to resolve property placeholders in Spring @Value annotations.
    @Bean
    static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
        log.traceEntry("propertyPlaceholderConfigurer");
        return new PropertySourcesPlaceholderConfigurer();
    }
}

В myPackage.Config

package myPackage;

import org.apache.geode.cache.GemFireCache;
import org.apache.geode.cache.Region;
import org.apache.geode.cache.client.ClientRegionShortcut;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.gemfire.client.ClientRegionFactoryBean;

@Configuration
public class Config {
    private static final Logger log = LogManager.getLogger(Config.class);

@Bean("myRegion")
public Region<String, Object> myRegion(GemFireCache cache) {
    log.traceEntry();

    Region<String, Object> r = cache.getRegion("myRegion");
    r.setUserAttribute(ClientRegionShortcut.CACHING_PROXY);

    return r;
    }
}

1 Ответ

1 голос
/ 13 февраля 2020

В классе Config при определении компонента вы используете Region<String, Object> в качестве типа возвращаемого значения. Где, как в вашем Client классе вы определяете Region<String, String>. Здесь это явно несоответствие типов и, следовательно, бин не будет загружаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...