我有一个简单的场景,我按如下方式扩展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异常。包中的所有其他(非扩展)类都很好。关于什么是错的任何想法?
答案 0 :(得分:2)
这是一个小小的猜测 - 基于this文章,scala中的特征被转换为java接口。 所以,你的特点:
trait Vehicle {
@Autowired
private var myDistanceLogger: MyDistanceLogger = null
}
会被翻译成:
public interface Vehicle {
public MyDistanceLogger myDistanceLogger();
}
和@Autowired
在getter中没有意义,我猜这就是为什么这不会被自动装配的原因。
答案 1 :(得分:0)
我刚刚对此进行了测试,它确实有效 - 特性中的私有变量可以正确自动装配。
你什么时候打电话旅行()?也就是说,在所有Spring初始化完成后,你是否确实在调用它?
答案 2 :(得分:0)
Scala将注释放在字段上,Spring将找不到它。您需要确保它放在Scala的内部setter方法上:
import scala.annotation.meta.setter
@(Autowired @setter)
private var myDistanceLogger: MyDistanceLogger = _