Spring Spring профиль по умолчанию

В проекте, над которым я сейчас работаю, нам нужно несколько профилей, то есть "по умолчанию" и "облако".
и DefaultContext, и CloudContext содержат одинаковые определения bean-компонентов. Мы используем PCF(Pivotal Cloud Foundry)

мы создали интерфейс

public interface Config {
    public DataSource getDataSource();
    public SomeService getService();
}

Затем реализуйте каждый профиль с этим интерфейсом

@Primary
@Configuration
@Profile("default")
public class DevConfig implements Config
{
    public DataSource getDataSource() {
         // create and return production datasource
    }

    public SomeService getService() {
        // Create and return production service
    }
}

И затем сделайте то же самое для облака.

@Configuratio
@Profile("cloud")
public class CloudConfig extends AbstractCloudConfig implements Config
{
    public DataSource getDataSource() {
         // create and return dummy datasource
    }

    public SomeService getService() {
        // Create and return dummy service
    }
}

И мы проводим Autowiring в сервисном вызове, в файле процессора.

@Service("processor")
public class Processor {

    @Autowired Config dsConfig;

    public object get(int Number)
    {
        return dao.get(Number,dsConfig.getDataSource());
    }
}

Если мы развернем в PCF, он будет работать нормально, так как профиль будет облачным. Если мы работаем локально, он должен получить профиль по умолчанию, но dsConfig имеет значение null. Не могли бы вы помочь в этом.

2 ответа

@Configuration классы не доступны для автоматической проводки.

Как отметил @spencergibb в комментарии, вы должны указать контейнеру сделать эти классы доступными для автопроводки.

Для этого аннотировать их @Component,

Что-то вроде этого:

@Component
@Profile("default")
public class DevConfig implements Config
{
    public DataSource getDataSource() {
         // create and return production datasource
    }

    public SomeService getService() {
        // Create and return production service
    }
}

Если это все еще не работает, проверьте следующие два пункта:

  • У тебя есть конфиги (DevConfig а также Cloudconfig) в разных пакетах, чтобы ContextScan не нашел его?
  • Вы работаете в другом профиле локально? (лайк Dev).

Вы можете вставить этот фрагмент в свой код (его из JHipster) для регистрации активных профилей.

    @Autowired
    private Environment env;

    /**
     * Initializes Application.
     * <p/>
     * Spring profiles can be configured with a program arguments --spring.profiles.active=your-active-profile
     * <p/>
     */
    @PostConstruct
    public void initApplication() throws IOException {
        if (env.getActiveProfiles().length == 0) {
            log.warn("No Spring profile configured, running with default configuration");
        }
        else {
            log.info("Running with Spring profile(s) : {}", Arrays.toString(env.getActiveProfiles()));
        }
    }

Я бы предпочел autowire источник данных и классы обслуживания вместо класса конфигурации. Таким образом, вам не понадобится ни один экземпляр конфигурации, и вы можете напрямую подключать любой класс, какой захотите.

Так что классы будут выглядеть ниже. Конфигурация по умолчанию:

@Primary
@Configuration
@Profile("default")
public class DevConfig implements Config
{
    @Bean
    public DataSource getDataSource() {
     // create and return production datasource
    }

    @Bean
    public SomeService getService() {
        // Create and return production service
    }
}

Cloud Config:

@Configuration
@Profile("cloud")
public class CloudConfig extends AbstractCloudConfig implements Config
{
    @Bean
    public DataSource getDataSource() {
         // create and return dummy datasource
    }

    @Bean
    public SomeService getService() {
        // Create and return dummy service
    }
}

Класс процессора:

@Service("processor")
public class Processor {

    @Autowired
    private DataSource dataSource;

    public object get(int Number)
    {
        return dao.get(Number,datasource);
    }
}
Другие вопросы по тегам