Использование 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 = _