我想把两个项目移植到Spring Boot 1.1.6。这两个项目都是一个大项目的一部分。它们都需要与每个基于Web请求的区域的7个生产数据库中的1个建立SQL连接。其中一个项目将配置设置持久化到Mongo数据库。它们目前都能正常工作,但SQL配置是基于XML的,而Mongo是基于application.properties的。我想在发布之前将配置转移到xml或注释上,以简化维护。
这是我在这个论坛的第一次尝试,我可能也需要一些这方面的指导。我把多数据库标签放在那里。大部分的处理方式是一次打开两个连接。这里只有一个,而且只有URL会改变。Schema和其余的都是一样的。
在XML时尚...
@Controller
public class CommonController {
private CommonService CommonService_i;
@RequestMapping(value = "/rest/Practice/{enterprise_id}", method = RequestMethod.GET)
public @ResponseBody List<Map<String, Object>> getPracticeList(@PathVariable("enterprise_id") String enterprise_id){
CommonService_i = new CommonService(enterprise_id);
return CommonService_i.getPracticeList();
}
@Service
public class CommonService {
private ApplicationContext ctx = null;
private JdbcTemplate template = null;
private DataSource datasource = null;
private SimpleJdbcCall jdbcCall = null;
public CommonService(String enterprise_id) {
ctx = new ClassPathXmlApplicationContext("database-beans.xml");
datasource = ctx.getBean(enterprise_id, DataSource.class);
template = new JdbcTemplate(datasource);
}
每次请求时,都会用相应的数据库连接创建一个所需服务的新实例。
在spring boot的世界里,我遇到了一篇文章,它扩展了TomcatDataSourceConfiguration。http:/xantorohara.blogspot.com201311spring-boot-jdbc-with-multiple.html。 这至少让我创建了一个java配置类,但是,我不能像上面的XML那样,想出一种方法来改变每个请求的ConfigurationProperties的前缀。我可以设置多个配置类,但是DAO中的@Qualifier("00002")必须是一个静态值。 /注释属性Qualifier.value的值必须是一个常量表达式。
@Configuration
@ConfigurationProperties(prefix = "Region1")
public class DbConfigR1 extends TomcatDataSourceConfiguration {
@Bean(name = "dsRegion1")
public DataSource dataSource() {
return super.dataSource();
}
@Bean(name = "00001")
public JdbcTemplate jdbcTemplate(DataSource dsRegion1) {
return new JdbcTemplate(dsRegion1);
}
}
在Mongo方面,我能够在configurationProperties类中定义变量,如果在相应的application.properties文件中有匹配的条目,它就会用文件中的值覆盖它。如果没有,它就使用代码中的值。这对于JDBC端来说是行不通的。如果你在你的config类中定义了一个变量,那么就会使用这个值。(是的......我知道上面写的是mondoUrl)
@ConfigurationProperties(prefix = "spring.mongo")
public class MongoConnectionProperties {
private String mondoURL = "localhost";
public String getMondoURL() {
return mondoURL;
}
public void setMondoURL(String mondoURL) {
this.mondoURL = mondoURL;
}
今天有一个问题得到了解答,让我更接近了一点。Spring Boot的application.properties值没有填充 答案告诉我如何至少让@Value发挥作用。有了这个,我就可以建立一个dbConfigProperties类,抓取@Value。唯一的问题是,@Value所抓取的值只有在程序第一次启动时才能使用。除了在程序启动时在控制台日志中看到它之外,我不确定如何使用它。我现在知道的是,在某个时候,在dbConfigProperties类的@Autowired中,它确实返回了相应的值。但当我想使用它的时候,它返回的是 ${spring.datasource.url} 而不是值。
好吧......谁能告诉我,@Value不是我唯一的选择。我在控制器中放了下面的代码,我能够可靠地检索到${spring.datasource.url}。我能够可靠地检索一个值,Yay。我想我可以把我的属性文件中每个可能的属性名硬编码到这个函数的参数中,然后填充一个类。我显然做错了什么。
private String url;
//private String propname = "${spring.datasource.url}"; //can't use this
@Value("${spring.datasource.url}")
public void setUrl( String val) {
this.url = val;
System.out.println("==== value ==== " + url);
}
这真是太棒了......终于有了一些进展。我相信我已经放弃了改变ConfigurationProperties和使用@Value这个问题。有了这个家伙的答案,我可以访问在启动时创建的bean。你们可能都在想我当初为什么不这样做......还在学习。我把他撞上去了。这救了我一命。https:/stackoverflow.coma245956854028704
现在的计划是为每个区域创建一个JdbcTemplate生产Bean,像这样。
@Configuration
@ConfigurationProperties(prefix = "Region1")
public class DbConfigR1 extends TomcatDataSourceConfiguration {
@Bean(name = "dsRegion1")
public DataSource dataSource() {
return super.dataSource();
}
@Bean(name = "00001")
public JdbcTemplate jdbcTemplate(DataSource dsRegion1) {
return new JdbcTemplate(dsRegion1);
}
}
当我调用我的服务时,我会使用这样的东西。
public AccessBeans(ServletRequest request, String enterprise_id) {
ctx = RequestContextUtils.getWebApplicationContext(request);
template = ctx.getBean(enterprise_id, JdbcTemplate.class);
}
我对更好的方法或可预见的问题等持开放态度 但这种方式似乎和我目前基于XML的方式差不多。有什么想法?