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);
}
}