質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Q&A

解決済

2回答

4139閲覧

Springbootで複数DBを参照したい

taa-sap_032

総合スコア3

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

0グッド

0クリップ

投稿2021/10/05 03:13

編集2021/10/05 03:18

前提・実現したいこと

Springboot環境・ロジックはJava使用ので、1つのDBを参照・更新していたものを複数(2つ)のDBを参照・更新するよう修正したい。

発生している問題・エラーメッセージ

実行時に以下のメッセージが表示され、最初の画面が表示されない。

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'Contorller1': Unsatisfied dependency expressed through field 'loginService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'loginService': Unsatisfied dependency expressed through field 'npjdbcTemplate'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=JdbcTemplate1)}

該当のソースコード

Java

1(Properties) 2 3... 4spring.datasource.jdbc-url=jdbc:postgresql://***.***.***.***:5432/(db1) 5spring.datasource.url=jdbc:postgresql://***.***.***.***:5432/(db1) 6spring.datasource.username=postgres 7spring.datasource.password= 8spring.datasource.driverClassName=org.postgresql.Driver 9spring.seconddatasource.jdbc-url=jdbc:postgresql://***.***.***.***:5432/(db2) 10spring.seconddatasource.url=jdbc:postgresql://***.***.***.***:5432/(db2) 11spring.seconddatasource.username=postgres 12spring.seconddatasource.password= 13spring.seconddatasource.driverClassName=org.postgresql.Driver 14... 15

Java

1(Configクラス) 2@Configuration 3public class JdbcConfig { 4 @Bean(name="datasource1") 5 @Primary 6 @ConfigurationProperties(prefix="spring.datasource") 7 public DataSource DataSource1(){ 8 return DataSourceBuilder.create().build(); 9 } 10 11 @Bean(name="datasource2") 12 @ConfigurationProperties(prefix="spring.seconddatasource") 13 public DataSource DataSource2() { 14 return DataSourceBuilder.create().build(); 15 } 16 17 @Primary 18 @Bean(name="JdbcTemplate1") 19 @Autowired 20 JdbcTemplate createJdbcTemplate1(@Qualifier("datasource1") DataSource ds){ 21 return new JdbcTemplate(ds); 22 } 23 24 @Bean(name="JdbcTemplate2") 25 @Autowired 26 JdbcTemplate createJdbcTemplate2(@Qualifier("datasource2") DataSource ds){ 27 return new JdbcTemplate(ds); 28 } 29 30 @Primary 31 @Bean(name="NpJdbcTemplate1") 32 NamedParameterJdbcTemplate createNpJdbcTemplate1(@Qualifier("datasource1") DataSource ds){ 33 return new NamedParameterJdbcTemplate(ds); 34 } 35 36 @Bean(name="NpJdbcTemplate2") 37 NamedParameterJdbcTemplate createNpJdbcTemplate2(@Qualifier("datasource2") DataSource ds){ 38 return new NamedParameterJdbcTemplate(ds); 39 } 40 41}

Java

1(Controller) 2.... 3@Controller 4@EnableAutoConfiguration 5public class xxxContorller { 6 @Autowired 7 LoginService loginService; 8 9 @RequestMapping(value="/login", method=RequestMethod.GET) 10 public String login(Model model) { 11 Optional<Information>infoList = loginService.findInformation(); 12 .... 13 return "/xxx/login"; 14 } 15.... 16} 17 18(Service) 19.... 20@Service 21public class LoginService { 22 23 @Autowired 24 @Qualifier("tengaJdbcTemplate") 25 private NamedParameterJdbcTemplate npjdbcTemplate; 26 27 .... 28 29 public Optional<Information> findInformation(){ 30 31 Optional<Information> retInfo = Optional.of(new Information()); 32 33 String sql="select * from information where id=:id"; 34 SqlParameterSource parameters = new MapSqlParameterSource("id",CodetableKey.MESSAGE_ID_LOGIN); 35 List<Map<String, Object>> ret = npjdbcTemplate.queryForList(sql,parameters); 36 37 .... 38 } 39.... 40}

試したこと

  • サービスLoginServiceのnpjdbcTemplateのアノテーションについて、@Autowiredのみの場合は正常に開始できて、DBからデータ取得が正常に行えている。

(テーブルinformation はプロパティファイルのDB1にのみ存在する)

  • サービスLoginServiceのnpjdbcTemplateのアノテーションについて、@Qualifierのみの場合はエラーなく開始はできるがDB検索実施の行でnpjdbcTemplateがNullになっている。

補足情報(FW/ツールのバージョンなど)

Java 1.8
Postgresql 11.9

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/10/05 03:29

なぜ、そうする必要があるのでしょうか。
taa-sap_032

2021/10/05 04:01

複数DBアクセスが必要な理由として、他システムで使用しているデータ自分たちが担当しているシステムから参照したいからです。 複数DBアクセスが不可能なら、データを自分たちのシステムが所有しているDBに取り込む仕組みを考えなければならないのですが...。
guest

回答2

0

その「他システム」からデータを提供するAPIを用意しては如何でしょうか。
本来利用するシステムではないところに実装するのは整合性や可読性に欠けますし、メンテナンス性も良くないと思います。
想定しない利用や編集が起きるかもしれません。

基本は1システム1DBとしてください。

投稿2021/10/05 04:33

m.ts10806

総合スコア80842

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

ServiceクラスのNamedParameterJdbcTemplate クラスのアノテーション設定の、@Qualifierの名前設定が間違っていた(パラメータなしのJdbcTemplateのBean名を指定していた)のを発見しました。
NamedParameterJdbcTemplateのBean名に修正したところ、データ検索結果が取得できるようになりました。

(db1とdb2で同じ構造のinformationテーブルを作成して、レコード内容をdb1とdb2で変えた状態でデータソースを変えた状態で検索結果を確認 → db1、db2でのレコード設定値が検索結果として出力されたことを確認しました。)

投稿2021/10/05 05:09

taa-sap_032

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問