Использование Spring @Autowired с чертой Scala

У меня есть простой сценарий, где я расширяю признак Scala следующим образом:

    trait Vehicle {

      @Autowired
      private var myDistanceLogger: MyDistanceLogger = null

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

    @Component
    class Truck extends Vehicle {

    }

хотя пакет грузовика находится в компонентном сканировании Springs, я получаю исключение nullpointer. Все остальные (не расширенные) классы в пакете подключены нормально. Есть идеи, что не так?

3 ответов


Это немного спекуляция-черты в scala переводится на интерфейс java, основанный на этой статьи. Итак, ваша черта:

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

будет переведено на:

public interface Vehicle {
    public MyDistanceLogger myDistanceLogger();
}

и @Autowired не имеет смысла в геттере, я предполагаю, что это причина, по которой это не получает autowired.


Я только что проверил это, и это работает - частный var в черте получает autowired правильно.

когда вы вызываете travel ()? То есть, вы называете это точно после того, как вся инициализация Spring завершена?


Scala помещает аннотацию на поле, где Spring ее не найдет. Вы должны убедиться, что он размещен на внутреннем методе сеттера Scala:

import scala.annotation.meta.setter

@(Autowired @setter)
private var myDistanceLogger: MyDistanceLogger = _