実装が異なる2つのデータプロジェクトに依存するSpringBootアプリケーション(MyAppなど)を開発しています。
data-jdbc.jar
spring-boot-starter-jdbc
を使用して構築サンプルコード:
@Service
public class JDBCDataServiceImpl implements JDBCDataService {
@Autowired
private JDBCDataRepository jdbcDataRepository;
...
}
my.data.jdbc
JDBCTemplate
を使用していますサンプルリポジトリ:
@Repository
public class JDBCDataRepositoryImpl implements JDBCDataRepository {
@Autowired
protected JdbcTemplate jdbcTemplate;
...
}
data-jpa.jar
spring-boot-starter-data-jpa
を使用して構築され、アプリケーションでも使用されるJPADataServiceクラスも公開しますサンプルコード:
@Service
public class JPADataServiceImpl implements JPADataService {
@Autowired
private JPADataRepository jpaDataRepository;
...
}
my.data.jpa
CrudRepository
インターフェイスを拡張しますサンプルリポジトリ:
@Repository
public interface JPADataRepository extends CrudRepository<MyObject, Integer{
...
}
私のSpringBootプロジェクトには、次のSpringBootメインアプリケーションがあります。
@SpringBootApplication
public class MyApp extends SpringBootServletInitializer {
}
私のビジネスサービスMainService
クラスには、次のインジェクションがあります
@Service
public class MainServiceImpl implements MainService {
@Autowired
private JDBCDataService jdbcDataService;
@Autowired
private JPADataService jpaDataService;
しかし、クラスJPADataService
にのみ存在する"Could not Autowire. No beans of 'JPADataService' type found"
の問題に遭遇しましたが、JDBCService
クラスでは問題なく動作します。
私は次の質問で見つかった解決策を試しましたが、私の場合はこれらのいずれも動作しません:
依存ライブラリJarに存在するBeanを@Autowireできませんか?
@ComponentScan(basePackages = {"org.example.main", "package.of.user.class"})
外部jarから作成されたSpring Beanを@Autowireするにはどうすればよいですか?
@Configuration
@ComponentScan("com.package.where.my.class.is")
class Config {
...
}
問題の解決策を見つけました。データライブラリをスキャンするには、メインのMyApp.Javaを1パッケージレベル上に移動する必要があります。
MyApp.Java
をmy.app
パッケージの下に置く代わりに、my.data.jpa
およびmy.data.jdbc
パッケージでライブラリを正常にスキャンするために、my
の下に移動する必要があります。
これで問題の解決策が見つかりました。データライブラリをスキャンするには、メインのMyApp.Javaを1パッケージレベル上に移動する必要があります。
MyApp.Java
パッケージの下にmy.app
を置くのではなく、my.data.jpa
およびmy.data.jdbc
パッケージでライブラリを正常にスキャンするために、my
の下に移動する必要があります。
Autowireしようとしているクラスに@Componentアノテーションが付いていない場合、@ ComponentScanを追加しても機能しません。これを機能させるには、@Configuration
クラスのメソッドに注釈を付ける必要があります。次のようなものを使用すると、クラスを自動配線できます。
@Configuration
public class ConfigClass{
@Bean
public JPADataService jpaDataService(){
return new JPADataService();
}
}
外部jarでspring.factories
を設定する必要があります。
external-jar-project
|--Java
|--resources
|-- META-INF
|-- spring.factories
次のようなspring.factoriesのコンテキスト:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=xxx