2017-11-30 3 views
0

クラスパス上にモジュールを追加/削除できるようにするプロジェクト構造を作成しようとしています。 Springアプリケーションで@ComponentScan("com.companyname")注釈を使用すると、モジュールから注釈付きコンポーネントを検出して作成します。どこでも私のCrudRepositoryをautowireしようとしたとき、私はエラーを取得:ComponentScanを使用しているときにSpringがCrudRepository beansを見つけられない

Field repo in com.companyname.somemodule.services.SomeService required a bean of type 'com.companyname.somemodule.repos.SomeRepo' that could not be found. 

だから私は、彼らがモジュールの1つに定義されている場合多分それは何とかリポジトリを作成することができないと思ったので、私は先にwen'tとテストレポを追加しました私のベースSpringApplicationにし、私の驚きに私が得た:

Field repo in com.companyname.modularapp.TestService required a bean of type 'com.companyname.modularapp.TestRepo' that could not be found. 

は、その後、私はちょうど私の@ComponentScan注釈を削除し、私が意図したとおりに突然TestRepoが働いて、私は通常、テストエンティティを永続化して読むことができました。 ComponentScanはどうやらCrudRepositoryの作成を失敗させるか、それとも後で検出するかのいずれかです。

私はこのように私のレポを定義します。

@Entity 
public class Test { 
    @Id 
    private long id; 
} 

public interface TestRepo extends CrudRepository<Test, Long>{} 

私はこのプロジェクトで春ブーツ2.0.0.M7をしようとしているが、私はそれが原因だ疑い。 私は何かを見逃しましたか?

答えて

1

また、あなたがして、スキャンリポジトリ用のパッケージを定義することができます:あなたのプロジェクトでパッケージスキャンをカスタマイズする場合は、おそらくあなたは手動で豆どれを設定する必要が

@EnableJpaRepositories("com.companyname") 

またはXMLの設定で

<jpa:repositories base-package="com.companyname"/> 
+0

これはちょうど私が行方不明だった!私は前にそれを試しましたが、パッケージ名を渡すことはできません。本当にありがとう!実際にエンティティがアンマネージドであるというエラーが出ましたが、 '@EntityScan(" com.companyname ")' –

0

spring-bootを使用している場合は、@SpringBootApplicationアノテーションに既に定義されているように@ComponentScanアノテーションを削除することもできます。おそらく、それらの間に何らかの矛盾があるかもしれません。コードを見ずに話すのは難しいでしょう。

+0

基本的なアプリが "com.companyname"パッケージではなく "com.companyname.modularapp"にあり、モジュールが "com.companyname.somemodule"になっていたので実際にこの混乱が起こったので、ComponentScanのレベルを1ポイント上げる必要がありました。 –

0

パスをスキャンする必要があります。 JPAの場合はLocalContainerEntityManagerFactoryBeanの独自のBeanを作成できます(ここでは自動設定の例があります)。 org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration#entityManagerFactory - spring-boot 1.5。*のクラスリンクです。 しかし、パッケージスキャンのカスタマイズを必要としない場合は、プロジェクトのルートに@SpringBootApplicationアノテーションを付けたクラスを入れて、spring :: runメソッドに渡してください。

関連する問題