2014-10-23 2 views
0

Я пытаюсь использовать весенние профили, чтобы иметь конфигурацию персистентности для разработки и одну для создания под названием openshift. Я вижу, что мой профиль openshift загружен ни одним из моих методов не вызван ... судя по отсутствию сообщений журнала. Кто-нибудь понял, что я делаю неправильно?Способы поиска loading

import ...; 

@Configuration 
@PropertySource("classpath:persistence-${envTarget:default}.properties") 
@EnableJpaRepositories(basePackages = {"dk.fitfit.campusfood.model", "dk.fitfit.campusfood.repository"}) 
public class PersistenceConfig { 
    private static final Logger logger = LoggerFactory.getLogger(PersistenceConfig.class); 

    @Autowired 
    private DataInitializer dataInitializer; 

    @Autowired 
    private Environment env; 

    private final String packagesToScan = "dk.fitfit.campusfood.*"; 


    public PersistenceConfig() { 
     logger.info("PersistenceConfig loaded!"); 
    } 

    @Bean 
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { 
     return new PropertySourcesPlaceholderConfigurer(); 
    } 

    @Bean 
    public DataSource dataSource() { 
     return new EmbeddedDatabaseBuilder() 
      .setType(EmbeddedDatabaseType.H2) 
      .build(); 
    } 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
     LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); 
     factory.setDataSource(dataSource()); 
     factory.setPackagesToScan(packagesToScan); 
     factory.setJpaVendorAdapter(jpaVendorAdapter()); 
     factory.setJpaProperties(additionalProperties()); 
     return factory; 
    } 

    @Bean 
    public JpaVendorAdapter jpaVendorAdapter() { 
     HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter(); 
     hibernateJpaVendorAdapter.setShowSql(true); 
     hibernateJpaVendorAdapter.setGenerateDdl(true); 
     hibernateJpaVendorAdapter.setDatabase(Database.H2); 
     return hibernateJpaVendorAdapter; 
    } 

    private Properties additionalProperties() { 
     Properties properties = new Properties(); 
     properties.setProperty("hibernate.hbm2ddl.auto", "create"); 
     properties.setProperty("hibernate.dialect", env.getProperty("jdbc.hibernate.dialect")); 
     properties.setProperty("hibernate.show_sql", "true"); 
     return properties; 
    } 

    @Bean 
    public PlatformTransactionManager transactionManager() { 
     JpaTransactionManager transactionManager = new JpaTransactionManager(); 
     transactionManager.setEntityManagerFactory(entityManagerFactory().getObject()); 
     return transactionManager; 
    } 

    // Activate this profile on openshift by running: rhc set-env JAVA_OPTS_EXT=-Dspring.profiles.active=openshift -a campusfood 
    @Configuration 
    @Profile("openshift") 
    public static class OpenShiftPersistenceConfig { 
     private static final Logger logger = LoggerFactory.getLogger(OpenShiftPersistenceConfig.class); 

     private String driverClassName = "org.postgresql.Driver"; 
     private String database = "campusfood"; 
     private String url = System.getenv("OPENSHIFT_POSTGRESQL_DB_URL") + "/" + database; 

     @PostConstruct 
     public void postConstructor() 
     { 
      logger.info("OpenShiftPersistenceConfig loaded!"); 
     } 

     @Bean 
     public JpaVendorAdapter jpaVendorAdapter() { 
      logger.info("jpaVendorAdapter()"); 
      HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
      vendorAdapter.setGenerateDdl(true); 
      vendorAdapter.setShowSql(true); 
      vendorAdapter.setDatabase(Database.POSTGRESQL); 
      return vendorAdapter; 
     } 

     @Bean 
     public DataSource dataSource() 
     { 
      logger.info("dataSource()"); 
      BasicDataSource dataSource = new BasicDataSource(); 
      dataSource.setDriverClassName(driverClassName); 
      dataSource.setUrl(url); 
      return dataSource; 
     } 
    } 
} 

Исключение:

org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'entityManagerFactory': Requested bean is currently in creation: Is there an unresolvable circular reference? 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.beforeSingletonCreation(DefaultSingletonBeanRegistry.java:335) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328) 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108) 
    at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:632) 
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:442) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1094) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:989) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:276) 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:129) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1456) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1197) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1017) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:960) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1017) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:960) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:370) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1094) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:989) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:973) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:750) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658) 
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:624) 
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:672) 
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:543) 
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:484) 
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) 
    at javax.servlet.GenericServlet.init(GenericServlet.java:160) 
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1280) 
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1193) 
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1088) 
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5176) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5460) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 

persistence-openshift.properties

################### DataSource Configuration ########################## 
jdbc.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect 

persistence-default.properties

################### DataSource Configuration ########################## 
jdbc.hibernate.dialect=org.hibernate.dialect.H2Dialect 
+0

Зачем дублировать всю конфигурацию? Только несколько вещей разные (как я уже говорил в [исходной теме] (http://stackoverflow.com/questions/26529300/different-persistenceconfig-java-for-development-and-production/26529468#26529468), которую вы создали) , Кроме того, '@ Autowired' в' static' -поле не работает, и я считаю, что только один метод может быть аннотирован с помощью '@ PostConstruct'. –

+0

Способы, дублированные, немного отличаются от родительского класса. Могу ли я сделать это по-другому? Я предположил, что это была несколько новая проблема и, таким образом, сделала новую тему. Как я могу получить доступ к классу autowired в дочернем классе, если он не статичен? Спецификации действительно утверждают, что один метод может быть аннотирован с помощью @PostConstruct ... но оба они выполнялись. – user672009

+0

Они отличаются друг от друга только свойствами, те свойства, которые вы можете поместить в файл свойств (как я объяснил в другом потоке). Единственное, что вам нужно, это другой источник данных и, по-видимому, вы хотите, чтобы инициализатор выполнялся в случае профиля openshift. Затем просто вставьте компонент в другую конфигурацию. –

ответ

1

Ваша конфигурация должна выглядеть примерно так.

@Configuration 
@PropertySource("classpath:persistence-${envTarget:default}.properties") 
@EnableJpaRepositories(basePackages = {"dk.fitfit.campusfood.model", "dk.fitfit.campusfood.repository"}) 
public class PersistenceConfig { 
    private static final Logger logger = LoggerFactory.getLogger(PersistenceConfig.class); 

    @Autowired 
    private DataInitializer dataInitializer; 

    @Autowired 
    private Environment env; 

    private final String packagesToScan = "dk.fitfit.campusfood"; 


    public PersistenceConfig() { 
     logger.info("PersistenceConfig loaded!"); 
    } 

    @Bean 
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { 
     return new PropertySourcesPlaceholderConfigurer(); 
    } 

    @Bean 
    public DataSource dataSource() { 
     return new EmbeddedDatabaseBuilder() 
      .setType(EmbeddedDatabaseType.H2) 
      .build(); 
    } 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) { 
     LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); 
     factory.setDataSource(dataSource); 
     factory.setPackagesToScan(packagesToScan); 
     factory.setJpaVendorAdapter(jpaVendorAdapter()); 
     return factory; 
    } 

    @Bean 
    public JpaVendorAdapter jpaVendorAdapter() { 
     HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter(); 
     hibernateJpaVendorAdapter.setShowSql(true); 
     hibernateJpaVendorAdapter.setGenerateDdl(true); 
     hibernateJpaVendorAdapter.setDatabasePlatform(env.getRequiredProperty("jdbc.hibernate.dialect")); 
     return hibernateJpaVendorAdapter; 
    } 

    @Bean 
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf) { 
     JpaTransactionManager transactionManager = new JpaTransactionManager(); 
     transactionManager.setEntityManagerFactory(emf); 
     return transactionManager; 
    } 

    @Profile("!openshift") 
    @Configuration 
    public static class DefaultPersistenceConfig { 
     @Bean 
     public DataSource dataSource() { 
      return new EmbeddedDatabaseBuilder() 
      .setType(EmbeddedDatabaseType.H2) 
      .build(); 
     } 
    } 

    // Activate this profile on openshift by running: rhc set-env JAVA_OPTS_EXT=-Dspring.profiles.active=openshift -a campusfood 
    @Configuration 
    @Profile("openshift") 
    public static class OpenShiftPersistenceConfig { 
     private static final Logger logger = LoggerFactory.getLogger(OpenShiftPersistenceConfig.class); 

     private String driverClassName = "org.postgresql.Driver"; 
     private String database = "campusfood"; 
     private String url = System.getenv("OPENSHIFT_POSTGRESQL_DB_URL") + "/" + database; 

     @PostConstruct 
     public void postConstructor()t 
     { 
      logger.info("OpenShiftPersistenceConfig loaded!"); 
     } 

     @Bean 
     public DataSource dataSource() 
     { 
      logger.info("dataSource()"); 
      BasicDataSource dataSource = new BasicDataSource(); 
      dataSource.setDriverClassName(driverClassName); 
      dataSource.setUrl(url); 
      return dataSource; 
     } 
    } 
} 

Обратите внимание, что нет более additionalProperties как те уже были установлены с помощью адаптера поставщика. Диалект устанавливается на основе свойства и использует свойство databasePlatform на адаптере поставщика.

Зависимости, необходимые для EntityManagerFactory, теперь являются частью сигнатуры метода, Spring при необходимости впрыскивает их.

Ваши пакетыToScan также были неправильными, это не шаблон, а имя пакета.

Если у вашего DataInitializer есть зависимость от EntityManagerFactory, у вас возникнут проблемы, так как теперь у вас есть круговая зависимость. Не отключайте его, если вы хотите что-то сделать, добавьте аннотированный метод @PostContruct к DataInitializer.

+0

Я до сих пор не могу загрузить его! https://github.com/tonsV2/CampusFood/blob/master/src/main/java/dk/fitfit/campusfood/config/PersistenceConfig.java - Любой ключ? – user672009

+0

Ваш unix, поэтому '.', вероятно, не будет работать с' SPRING_PROFILES_ACTIVE' вместо 'spring.profiles.active'. –

+0

Согласно logger.info ("env.getActiveProfiles(): {} ", env.getActiveProfiles()) Профиль активен – user672009

Смежные вопросы