OSGi аннотации (Активировать, Ссылка, Компонент) в Scala - PullRequest
2 голосов
/ 07 октября 2019

Я пытаюсь написать сервис OSGi в Scala (большинство других сервисов / пакетов написано на Java), и я немного борюсь с синтаксисом.

Обычно в Java можно использовать аннотацию @Activateна конструкторе, подобном следующему:

import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;
import org.osgi.service.component.annotations.Reference;

@Component(configurationPid = "PID", service=AgentService.class, immediate=true)
public class AgentServiceImpl implements AgentService {
   @Activate
    public AgentServiceImpl(@Reference Service1 service1, @Reference Service2 service2) {
  // ...
}

В Scala это должно выглядеть примерно так:

import org.osgi.service.component.annotations.{Activate, Component, Deactivate, Reference}

@Component(
  configurationPid = "PID",
  service = Array(classOf[AgentService]),
  immediate = true)
class AgentServiceImpl @Activate() (@Reference service1: Service1, 
                                    @Reference service2: Service2) implements AgentService {
   // ...
}

Когда я пытаюсь скомпилировать этот код Scala (с помощью gradle), я получаю следующее сообщение об ошибке:

error  : In component xxx.xxxx.xx.xx.agent.AgentServiceImpl , multiple references with the same name: service1. Previous def: xxx.xxxx.xx.xx.service.Service1, this def:
error  : In component xxx.xxxx.xx.xx.agent.AgentServiceImpl , multiple references with the same name: service2. Previous def: xxx.xxxx.xx.xx.service.Service2, this def:

Это происходит потому, что мой синтаксис относительно аннотаций неверен? Я особенно не уверен насчет этого @Activate() бита. В Java мне не нужно использовать скобки здесь - но он не компилируется без в Scala.

Кто-нибудь знает пример проекта, пытающийся сделать что-то подобное?

1 Ответ

2 голосов
/ 08 октября 2019

Я нашел решение:

Компиляция завершается успешно после добавления val перед параметрами конструктора:

import org.osgi.service.component.annotations.{Activate, Component, Deactivate, Reference}

@Component(
  configurationPid = "PID",
  service = Array(classOf[AgentService]),
  immediate = true)
class AgentServiceImpl @Activate() (@Reference val service1: Service1, 
                                    @Reference val service2: Service2) implements AgentService {
   // ...
}

Возможно, это связано с тем, что OSGi не может правильно работать с автоматически сгенерированными методами установкиservice1 и service2.

...