2017-03-13 22 views
1

Spring Boot DevTools(ホットリロードのライブラリ)を試したが、プロジェクトに組み込んだ後に問題が発生しました。SpringブートのDevTools初期化エラー

エラー名でBeanを作成する「project.specific.Bean」:@Lazyフィールドを持つ 豆はBeanCreationExceptionを上げたautowired依存性の注入は失敗しました。ネストされた例外はorg.springframework.aop.framework.AopConfigExceptionです:クラス[class project.specific.Factory]のCGLIBサブクラスを生成できませんでした:この問題の一般的な原因には、最終クラスまたは非可視クラスの使用が含まれます。ネストされた例外はorg.springframework.cglib.core.CodeGenerationExceptionです:にjava.lang.reflect.InvocationTargetException - >ヌル

project.specific.Bean私はデベロッパーツールを試してみました。この

@Component 
public class Bean ... { 
    ... 
    @Autowired 
    @Lazy 
    private Factory factory; 
    ... 
} 

のように見えます春のブートAthensBrusselsと同じ結果です。

単に@Lazyを削除したあと、@Repositoryに問題がありましたが、これはちょうど@Component(これはアテネでのみ試しました)に置き換えられました。

これは本当に奇妙な問題もあったその後:

とjava.lang.ClassCastException:project.specific.Productはproject.specific.Product

明らか

にキャストすることはできませんが、私は「ドンt @Lazyを削除し、@Repository@Componentと置き換えてみたいが、多分私は何か間違っているのだろうか?

答えて

0

おそらく、これはspring devツールの再起動クラスローダによって発生します。
は春ブーツが提供するリスタート・テクノロジーは2つの クラスローダを使用して動作Automatic restart

のドキュメントを参照してください。変更されないクラス(たとえば、 サードパーティ製のjarファイル)は、基本クラスローダーにロードされます。あなたが積極的に開発している のクラスは、再起動クラスローダーに読み込まれます。

つまり、一部のクラスが異なるクラスローダー(クラスローダーまたはベースクラスローダーの再起動)によって読み込まれたことを意味します。
クラスが異なるクラスローダによってロードされた場合、異なるクラス(Bean)として認識されます。

これは、プロジェクトがBeanをオートワイヤリングできず、同じクラス間でもClassCastExceptionが発生した理由です。

と回避策は、クラスローダがspring-devtools.propertiesによって明示的にクラスをロードする選択をすることができますhere

です。

+0

「基本」クラスローダーによってロードされるようにいくつかのクラス/ライブラリを除外する必要があることを意味しますか?しかし、 '@ Lazy'と' @ Repository'にあった問題は、すでに除外されているはずのjarファイルから来ています。 – RunninglVlan

関連する問題