2 つのプロジェクトを Spring Boot 1.1.6 に移植したいと考えています。それぞれがより大きなプロジェクトの一部です。どちらも、Web リクエスト ベースのリージョンごとに 7 つの実稼働データベースのうちの 1 つに SQL 接続を確立する必要があります。そのうちの 1 つは、構成設定を Mongo データベースに永続化します。どちらも現時点では機能していますが、SQL 構成は XML ベースで、Mongo は application.properties ベースです。保守を簡素化するために、リリース前に xml または注釈のいずれかに移行したいと考えています。
これはこのフォーラムでの私の最初の試みです。その分野でもガイダンスが必要になる場合があります。そこにマルチデータベースタグを付けました。それらのほとんどは、同時に開いている 2 つの接続を処理します。ここで一つだけ、URLだけが変わります。スキーマと残りは同じです。
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);
}
要求が行われるたびに、必要なサービスの新しいインスタンスが適切なデータベース接続で作成されます。
スプリング ブートの世界で、TomcatDataSourceConfiguration を拡張した 1 つの記事に出くわしました。 http://xantorohara.blogspot.com/2013/11/spring-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 側では機能しません。構成クラスで変数を定義すると、その値が使用されます。(ええ.. 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が私の唯一の選択肢ではないことを教えてください。次のコードをコントローラーに入れました。1 つの値を確実に取得できます。この関数の引数に、プロパティ ファイルから可能な各プロパティ名をハード コードして、クラスに入力することができると思います。私は明らかに何か間違ったことをしています。
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ベースの方法とほぼ同等のようです. 考え?