SpringBootアプリケーションで2つのデータソースを使用しようとしていて、2番目のデータソースをautowireにすることができません。私は多くのことを試してみましたが、これは、私が来た最も近い:SpringBootとSpringJDBCの複数のデータソース
私のYAMLファイル:
spring:
first-datasource:
url: MyURLString1
username: User
password: Password
driver-class-name: oracle.jdbc.OracleDriver
second-datasource:
url: MyURLString2
username: User
password: Password
driver-class-name: oracle.jdbc.OracleDriver
マイアプリケーションクラス:
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
@Bean
@Primary
@ConfigurationProperties(prefix = "spring.first-datasource")
public DataSource firstDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.second-datasource")
public DataSource secondDataSource() {
return DataSourceBuilder.create().build();
}
}
そして最後に、私のDAO:
@Repository
public class MyDao {
private static final String FIRST_SELECT = "select * from SomeTableInDB1";
private static final String SECOND_SELECT = "select * from AnotherTableInDB2";
@Autowired
private JdbcTemplate firstJdbcTemplate;
@Autowired
@Qualifier("secondDataSource")
private JdbcTemplate secondJdbcTemplate;
List<DB1Entity> getDB1Entity(Long id) {
return firstJdbcTemplate.query(FIRST_SELECT, new Object[] {id}, new BeanPropertyRowMapper(DB1Entity.class));
}
List<DB2Entity> getDB2Entity(Long id) {
return secondJdbcTemplate.query(SECOND_SELECT, new Object[] {id}, new BeanPropertyRowMapper(DB2Entity.class));
}
}
これまでに私が一番近かったのはこれです。 @Qualifierを削除すると、DAOメソッドの両方が実際に動作し、SECOND_SELECT文が自分のDB1に対して有効なSQLであると仮定しているため、最も近いと言います。一度私の非プライマリデータソースの@Qualifierを入れると、SpringはJdbcTemplateオブジェクトではなくDatasouceオブジェクトを期待しているので、私はautowireエラーを受け取ります。プライマリデータソースで動作するので、それは私には変です。ここで
は私のエラーです:
はフィールドautowireませんでした:プライベートorg.springframework.jdbc.core.JdbcTemplate org.my.classpath.secondJdbcTemplateを。ネストされた例外はorg.springframework.beans.factory.NoSuchBeanDefinitionExceptionです:タイプ[org.springframework.jdbc.core.JdbcTemplate]の適格なBeanが依存関係に見つかりませんでした:この依存関係のautowire候補となる少なくとも1つのbeanが必要です。依存関係の注釈:{@ org.springframework.beans.factory.annotation.Autowired(必須= true)、@ org.springframework.beans.factory.annotation.Qualifier(値= secondDataSource)}
DataSourceタイプのBeanを作成しますが、Autowire JdbcTemplateを作成します。あなたはおそらくこのようなものを持っているはずです。 'private JdbcTemplate jdbcTemplate1; プライベートJdbcTemplate jdbcTemplate2; @Autowired @Qualifier( "firstDataSource") パブリックvoid setDataSource(DataSource dataSource){ this.jdbcTemplate1 = new JdbcTemplate(dataSource); } @Autowired @Qualifier( "secondDataSource") 公共ボイドsetDataSource(データソースデータソース){ this.jdbcTemplate2 =新しいJdbcTemplate(データソース)。 } ' – lenach87
私はこれとほぼ同じものを試しましたが、nullのURLについてのエラーが発生しました。私はあなたのコードをコピーし、それが働いたので何かミスタイプする必要があります。ありがとう。私はそれが何かばかげたと確信しています。 – Gremash
@ lenach87これは正しい解決策であり、私はその質問が良いと思います。私はそれを正しいものとしてマークします。 – Gremash