3

В проекте, над которым я сейчас работаю, нам нужно иметь несколько профилей, то есть «по умолчанию» и «облако».
как DefaultContext и CloudContext содержат те же самые определения боба Мы используем ППР (Pivotal Cloud Foundry)Spring default default default

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

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. Не могли бы вы помочь в этом.

+1

Вы не должны вводить 'Config'. Поместите '@ Bean' на каждый метод. Затем вы должны вводить отдельные бобы. – spencergibb

ответ

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())); 
     } 
    } 
+0

Спасибо. Я проверил те моменты, которые вы упомянули. 1. Оба DevConfig и CloudConfig находятся в одних и тех же пакетах. 2. Я запускаю профиль по умолчанию в локальном режиме. Когда я проверил журналы с кодом. Я получил следующее сообщение: «Не настроен профиль Spring, работающий по умолчанию». Но dsConfig имеет значение null –

0

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

Итак, классы будут выглядеть ниже. По умолчанию Config:

@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 
    } 
} 

Облако 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); 
    } 
} 
Смежные вопросы