我想将两个项目移植到 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.com/2013/11/spring-boot-jdbc-with-multiple.html这至少允许我创建一个java配置类但是,我无法想出一种方法来改变前缀每个请求的 ConfigurationProperties 就像我对上面的 XML 所做的那样。我可以设置多个配置类,但 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 端。如果您在配置类中定义了一个变量,则使用该值。(是的..我知道上面写着 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 起作用。有了它,我可以设置一个获取@Value 的 dbConfigProperties 类。唯一的问题是@Value 获取的值仅在程序第一次启动时可用。除了在程序启动时在控制台日志中看到它之外,我不确定如何使用它。我现在所知道的是,在某些时候,在 dbConfigProperties 类的 @Autowired 中,它确实返回了适当的值。但是,当我想使用它时,它返回的是 ${spring.datasource.url} 而不是值。
好的...有人请告诉我@Value 不是我唯一的选择。我将以下代码放在我的控制器中。我能够可靠地检索一个值,耶。我想我可以将属性文件中每个可能的属性名称硬编码到该函数的参数中并填充一个类。我显然做错了什么。
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.com/a/24595685/4028704
现在的计划是为每个区域创建一个 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 的方法相当。想法?