加载多个Spring JPA上下文时出现问题

时间:2015-08-31 08:08:16

标签: spring jpa

我们正在开发一个从两个独立数据库[Mssql / Sybase]获取数据的应用程序。我们正在使用Spring JPA(OpenJPA实现)与两个数据库进行交互。我们为每个DB使用了两个不同的上下文文件(Mssqlcontext.java和SybaseContext.java)。我们在上下文文件(MsSqlProfile / SybaseProfile)中设置了单独的配置文件名称。我们需要根据配置有条件地加载上下文文件。但是,配置了哪个数据库的详细信息是在单独的配置xml文件中指定的。 XML文件作为bean的一部分读取。我们使用@import注释加载上下文。 JPA希望在加载上下文时提供正确的DB详细信息。但是在读取配置文件之前导入上下文。因此,我们无法提供正确的数据库详细信息。

试图解决的主要问题是,如果未配置任何数据库,Spring应用程序不应该崩溃。

我们尝试在导入上下文之前加载配置bean,方法是实现以下

  1. 条件
  2. ImportSelector
  3. DeferredImportSelector
  4. 但是这些没有按预期工作。

    示例代码

            public class SampleServiceInitializer implements WebApplicationInitializer
            {
                /**
                 * Register the Spring configuration.
                 */
                public void onStartup(ServletContext container) throws ServletException
                {
    
                    AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
                    ....
                    ....
                    ctx.register(SampleServiceConfiguration.class);
                    ....
                    ....
    
                }
            }
    
            @Import(SampleControllerConfiguration.class)
            public class SampleServiceConfiguration
            { 
                @Bean(name = configurationBean)
                @Scope("singleton")
                public ConfigRegistration getConfiguration()
                {
                    ConfigRegistration config = new ConfigRegistration();
                    config.init();
                    // Here we read the configurations and set the profile name(SyabseProfile/MssqlProfile)
                    return config;
                }
    
            }
    
    
            @Import({ SampleDataSourceConfiguration.class, SampleRequestorConfiguration.class })
            public class SampleControllerConfiguration
            {
            ....
            ....
            }
    
    
            @Import({ MSSqlContext.class, SybaseContext.class })
            public class SampleDataSourceConfiguration
            {
            ....
            ....
            }
    
            @Configuration
            @Profile(MsSqlProfile)
            ....
            ....
            public class MSSqlContext
            {
            ....
            ....
            }
    
    
            @Configuration
            @Profile(SybaseProfile)
            ....
            ....
            public class SybaseContext
            {
            ....
            ....
            }
    

    在上面的示例代码中,MSSqlContext和SybaseContext在configurationBean之前初始化。

0 个答案:

没有答案