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 组件扫描中,我也会收到一个空指针异常。包中的所有其他(非扩展)类都连接良好。关于什么是错的任何想法?

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

我刚刚对此进行了测试,它确实有效 - 特征中的私有 var 被正确自动装配。

你什么时候调用 travel()?也就是说,在所有 Spring 初始化完成之后,您确定调用它吗?

于 2012-06-01T23:50:25.373 回答
0

Scala 将注释放在 Spring 找不到的字段上。您需要确保将其放置在 Scala 的内部 setter 方法中:

import scala.annotation.meta.setter

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