web-dev-qa-db-ja.com

SpringBoot:他のJarライブラリからクラスを自動配線できない

実装が異なる2つのデータプロジェクトに依存するSpringBootアプリケーション(MyAppなど)を開発しています。

data-jdbc.jar

  • アプリケーションが使用するJDBCDataServiceクラスを公開するspring-boot-starter-jdbcを使用して構築

サンプルコード:

@Service 
public class JDBCDataServiceImpl implements JDBCDataService {

@Autowired
private JDBCDataRepository jdbcDataRepository;    
... 
}
  • パッケージmy.data.jdbc
  • springBootメインクラスはありません。単体テストクラスに対してのみ作成されたSpring構成
  • リポジトリクラスは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
  • springBootメインクラスはありません。単体テストクラスに対してのみ作成されたSpring構成
  • リポジトリクラスは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.Javamy.appパッケージの下に置く代わりに、my.data.jpaおよびmy.data.jdbcパッケージでライブラリを正常にスキャンするために、myの下に移動する必要があります。

14
Jown

これで問題の解決策が見つかりました。データライブラリをスキャンするには、メインのMyApp.Javaを1パッケージレベル上に移動する必要があります。

MyApp.Javaパッケージの下にmy.appを置くのではなく、my.data.jpaおよびmy.data.jdbcパッケージでライブラリを正常にスキャンするために、myの下に移動する必要があります。

11
Jown

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
1
Bond Zhou