2016-12-08 24 views
2

私は春のブート1.4.0でこの奇妙な動作が発生しました。 Springは基本的に、リソースに依存しないため、リソースにBeanをautowireできないことを伝えています。フィールド 'fooService'で表現されている満足していない依存関係:依存関係[aaa.FooService]のタイプBean [aaa.FooService]が見つかりません

UnsatisfiedDependencyException: Error creating bean with name 'restResource': Unsatisfied dependency expressed through field 
'fooService': No qualifying bean of type [**aaa.FooService**] found for dependency [**aaa.FooService**] 

FooServiceは、リソースにautowiredされています。リソースを作成する@Configurationファイルに@Autowireを入れると、リソースは期待通りにそこに注入されます。

これは動作します:

@RestController 
public class FooResource { 
    @Autowired 
    private FooService fooService; //bang 

public class ServiceMocksRestConfig extends WebMvcConfigurerAdapter { 
@Autowired 
private FooService fooService; //instance here 

@Bean 
public FooResource fooResource() { 
    return new FooResource(); // debuger stop here 
} 

//デバッガのステップは、誰かが間違っていたかもしれないもの、任意のアイデアを持っていますか?

面白いものは、私は、ブート春のランナーを使用してテストからアプリを実行すると、それはまた、(このリソースを含むすべてのもの、)

答えて

0

私は根本的な原因を見つけるために、今日の管理を動作することです。その春ブーツデベロッパーツール - より正確にそのスプリットクラスローダー(関連バグ:https://github.com/spring-projects/spring-boot/issues/3316

私はListableBeanFactoryにブレークポイントを置くとき、子供REST @ConfigurationがFooService

を@AutowireとしていたとFooServiceInterfaceのinstanceof FooServiceをしました、それは偽を返しました。 FooService.class.getClassLoader()とbeanfactory.getBean( "fooService"/はここではクラスを使用できません)例外が見つかりませんでした /)。getClass()。getClassloader()これらは異なっていました(1つはAppClassLoaderもう1つはdevtools再起動可能なクラスローダでした)。

解決方法:クラスパスからboot devtoolsを削除してください。

0

このため正確な理由は、実行時にはServiceMocksRestConfigFooServiceをautowireしようとした瞬間に春IOCコンテナ内タイプFooServiceのために初期化なし豆がないことです。

これは、開発のさまざまなミスによって引き起こされる可能性があります。このarticleは、この問題を引き起こす可能性のあるすべての間違いに対処しています。

関連する問題