嗨,我是Spring和Jpa Integration的初学者。虽然我尝试配置数据库连接,但详细说明了处理程序itp。我遇到了春天的奇怪行为。

首先,我有3个配置文件:

1)RootConfig-包含控制器以外的所有内容

2)WebConfig-包含每个带控制器注释的Bean

3)JdbcConfig-包含与dataSource相关的Bean,此配置由RootConfig使用此批注(@Import(JdbcConfig.class))导入。

RootConfig看起来像这样:

@Configuration
@Import(JdbcConfig.class)
@ComponentScan(basePackages = "app", excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,value = {EnableWebMvc.class, Controller.class})})
public class RootConfig
{

}


JdbcConfig:

@Configuration
@PropertySource("classpath:db.properties")
@EnableTransactionManagement
public class JdbcConfig
{

    @Resource
    public Environment env;


    @Bean
    public DataSource dataSource()
    {
        System.out.println(env);
        DriverManagerDataSource ds = new DriverManagerDataSource();
        ds.setDriverClassName(env.getProperty("dataSource.driverClassName"));
        ds.setUrl(env.getProperty("dataSource.Url"));
        ds.setUsername(env.getProperty("dataSource.username"));
        ds.setPassword(env.getProperty("dataSource.password"));
        return ds;

    }



    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(DataSource ds, JpaVendorAdapter jpaVendorAdapter)
    {
        LocalContainerEntityManagerFactoryBean emfb = new LocalContainerEntityManagerFactoryBean();
        emfb.setDataSource(ds);
        emfb.setJpaVendorAdapter(jpaVendorAdapter);
        emfb.setPackagesToScan("app.model");
        return emfb;
    }

    @Bean
    public JpaVendorAdapter jpaVendorAdapter()
    {
        HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
        adapter.setDatabase(Database.POSTGRESQL);
        adapter.setShowSql(true);
        adapter.setGenerateDdl(true);
        adapter.setDatabasePlatform(env.getProperty("dataSource.dialect"));

        return adapter;
    }



    @Bean
    public BeanPostProcessor beanPostProcessor()
    {
        return new PersistenceExceptionTranslationPostProcessor();
    }


    @Bean
    public JpaTransactionManager jpaTransactionManager(EntityManagerFactory em) {
        return new JpaTransactionManager(em)}}


此时一切正常,“环境”字段不是空值,并且包含所有已定义的属性。当我尝试添加Bean PersistenceAnnotationBeanPostProcessor时出现问题,因此,当我将此Bean添加到JdbcConfig.class时,环境字段变为空,但是当我添加此RootConfig环境时,环境再次包含所有需要的值。那么propertySource和这个bean是否存在任何已知问题? PersistenceAnnotationBeanPostProcessor是否会对@PropertySource或@Autorwired(@ Inject / @ Ressource)环境字段产生影响?有什么理由为什么必须在主配置中配置环境,而@Import不能从其他配置导入环境?

最佳答案

我认为您的问题与该春季问题SPR-8269有关。

您可以尝试将PersistenceAnnotationBeanPostProcessor bean定义设置为静态吗?

我也有同样的问题,我以这种方式解决了。

关于java - PersistenceAnnotationBeanPostProcessor是否对Environment或@PropertySource有影响?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39759167/

10-10 21:49