7

次のようにScalaトレイトを拡張する簡単なシナリオがあります。

    trait Vehicle {

      @Autowired
      private var myDistanceLogger: MyDistanceLogger = null

      def travel(miles:Int) = {
        println("travelling " + miles)
        myDistanceLogger.logMiles(miles)
      }
    }

    @Component
    class Truck extends Vehicle {

    }

TruckパッケージはSpringsコンポーネントスキャンに含まれていますが、nullpointer例外が発生します。パッケージ内の他のすべての(拡張されていない)クラスは正常に配線されています。何が悪いのかについて何か考えはありますか?

4

3 に答える 3

2

これは少し推測です-この記事に基づいて、scalaの特性はJavaインターフェースに変換されます。だから、あなたの特徴:

trait Vehicle {
      @Autowired
      private var myDistanceLogger: MyDistanceLogger = null
}

次のように翻訳されます:

public interface Vehicle {
    public MyDistanceLogger myDistanceLogger();
}

ゲッターでは意味があり@Autowiredませんが、これが自動配線されない理由だと思います。

于 2012-05-29T01:26:00.440 に答える
0

これをテストしたところ、機能します。トレイトのプライベート変数は正しく自動配線されます。

いつtravel()を呼び出しますか?つまり、すべてのSpringの初期化が完了した後、それを確実に呼び出していますか?

于 2012-06-01T23:50:25.373 に答える
0

Scalaは、Springが見つけられないフィールドに注釈を配置します。Scalaの内部セッターメソッドに配置されていることを確認する必要があります。

import scala.annotation.meta.setter

@(Autowired @setter)
private var myDistanceLogger: MyDistanceLogger = _
于 2013-07-12T12:30:54.560 に答える