我们正在开发一个从两个独立数据库[Mssql / Sybase]获取数据的应用程序。我们正在使用Spring JPA(OpenJPA实现)与两个数据库进行交互。我们为每个DB使用了两个不同的上下文文件(Mssqlcontext.java和SybaseContext.java)。我们在上下文文件(MsSqlProfile / SybaseProfile)中设置了单独的配置文件名称。我们需要根据配置有条件地加载上下文文件。但是,配置了哪个数据库的详细信息是在单独的配置xml文件中指定的。 XML文件作为bean的一部分读取。我们使用@import注释加载上下文。 JPA希望在加载上下文时提供正确的DB详细信息。但是在读取配置文件之前导入上下文。因此,我们无法提供正确的数据库详细信息。
试图解决的主要问题是,如果未配置任何数据库,Spring应用程序不应该崩溃。
我们尝试在导入上下文之前加载配置bean,方法是实现以下
但是这些没有按预期工作。
示例代码
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之前初始化。