2015-12-30 3 views
0

Рассмотрим следующий код:Как @Autowire объекты SCALA весной

TimeSeries.scala

trait TimeSeries { 
    def someMethod() 
} 

object TimeSeries extends TimeSeries { 
    def someMethod() = { new someOtherMethod() } 
} 

META-INF/весна/series.xml

<bean id="timeSeries" class="com.people.user.data.TimeSeries" /> 

SomeService.java

class SomeService 
{ 
    @Autowired 
    private TimeSeries timeSeries; 

    TimeSeries.someMethod(); //Compile Time Error 
} 

Первое, что нужно отметить, это TimeSeries.scala файл, имеющий TimeSeries Object, поэтому я предположил, что это оказывает объем класса, и поэтому я могу вызвать его метод непосредственно TimeSeries.someMethod(); без инстанцировании его.

Однако, это не тот случай. Я получаю ошибку времени компиляции при этом.

Cannot make a static reference to the non-static method `someMethod` 

Таким образом, я почувствовал, что представил @Autowiring, чтобы Spring могла автоматически создать его. Однако, это не работает, либо говорят об ошибке для:

<bean id="timeSeries" class="com.people.user.data.TimeSeries" />

Погрешность составляет: TimeSeries is an interface and not a class.

Я понял это и так изменили название класса объекта, чтобы быть:

object TimeSeriesImpl extends TimeSeries { 
     def someMethod() = { new someOtherMethod() } 
    } 

Также была изменена весна XML:

<bean id="timeSeries" class="com.people.user.data.TimeSeriesImpl" />

Но теперь возникает ошибка при создании экземпляра класса scala.

Кажется, что Spring не понимает, как создать экземпляр класса Scala с указанными выше конфигурациями.

Вот LOG:

LOG:

Instantiation of bean failed; nested exception 
is  org.springframework.beans. 
BeanInstantiationException: 
Could not instantiate bean class [com.people.user.data.TimeSeries]: 
No default constructor found; nested exception 
is java.lang.NoSuchMethodException: com.people.user. 
data.TimeSeries.<init>() 

ответ

1

Не удается сделать статическую ссылку на нестатической метод someMethod

Проблема заключается в том, Вы можете» t звоните TimeSeries.someMethod(); напрямую.

где, TimeSeries - это объект scala, а метод someMethod() - это метод на этом объекте.

Правильный путь:

TimeSeries$ timeSeries = TimeSeries$.MODULE$; timeSeries.someMethod();

Смежные вопросы