0

Я пытаюсь сделать простую службу OSGi, используя Declarative Services на локальном сервере Glassfish. Плагин, который обеспечивает, всегда активен.OSGi Декларативные услуги инъекции

У меня возникла проблема с впрыском в мой сервлет, который потребляет мое обслуживание, ссылка является нулевой, когда сервлет получает вызов, потому что это не тот же объект, что и тот, который был введен с помощью служебной ссылки.

Я протестировал его, поставив точку останова в мой установщик ссылок, и я увидел, что моя служба была введена, но когда я нажимаю на кнопку, которая вызывает мой сервлет в моем приложении, ссылка на службу является нулевой, потому что это не то же самое объект (т.е. получает впрыскивается в servlet_Instance # 1, но вызвать метод на servlet_Instance # 2. Я должен быть не хватает немного деталей, потому что я могу найти и использовать мою службу, делая

final BundleContext bundleContext = FrameworkUtil.getBundle(getClass()).getBundleContext(); 
    loggingTestServiceInterface = (LoggingTestServiceInterface) bundleContext.getService(bundleContext 
    .getServiceReference(LoggingTestServiceInterface.class.getName())); 

Плагин используется для создания моих XMLs файлы: maven-scr-plugin

<plugin> 
<groupId>org.apache.felix</groupId> 
<artifactId>maven-scr-plugin</artifactId> 
<version>1.14.0</version> 
<executions> 
    <execution> 
     <id>generate-scr-scrdescriptor</id> 
     <goals> 
      <goal>scr</goal> 
     </goals> 
    </execution> 
</executions> 
<configuration> 
    <supportedProjectTypes> 
     <supportedProjectType>war</supportedProjectType> 
     <supportedProjectType>jar</supportedProjectType> 
     <supportedProjectType>bundle</supportedProjectType> 
    </supportedProjectTypes> 
</configuration> 
</plugin> 

Это мой класс обслуживания

@Component(immediate = false, name = "Shikashi", service = {LoggingTestServiceInterface.class}, enabled = true) 
public class LoggingTestService implements LoggingTestServiceInterface 
{ 
private final LoggerUtils loggerUtils = new LoggerUtils(); 

public LoggingTestService() 
{ 
} 

@Activate 
public void start(final BundleContext bundleContext) 
{ 
    System.out.println("StartTest Service Fune"); 
} 

@Deactivate 
public void stop() 
{ 
    System.out.println("Stop Test Service Jitensha"); 
} 

@Modified 
public void modify() 
{ 
    System.out.println("Stop Test Service onnanogo"); 
} 

private Logger createLogger(final Class<?> clazz) 
{ 
    return Logger.getLogger(clazz); 
} 

@Override 
public void logDebug(final Class<?> clazz, final String message) 
{ 
    logDebug(clazz, message, null); 
} 
    @Override 
public void logDebug(final Class<?> clazz, final String message, final Throwable throwable) 
{ 
    final Logger logger = createLogger(clazz); 
    logger.debug(message, throwable); 
} 

} 

сгенерированного XML является

<?xml version="1.0" encoding="UTF-8"?> 
<components xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0"> 
<scr:component enabled="true" immediate="false" name="Shikashi" activate="start" deactivate="stop" modified="modify"> 
    <implementation class="com.sti.logging.service.LoggingTestService"/> 
    <service servicefactory="false"> 
     <provide interface="com.sti.loggingservices.serviceinterface.LoggingTestServiceInterface"/> 
    </service> 
</scr:component> 

Мой сервлет

@WebServlet(name = "Wakarimashita", urlPatterns = { "/Wakarimashita"}) 
@Component 
public class Wakarimashita extends HttpServlet 
{ 
private LoggingTestServiceInterface loggingTestServiceInterface; 

@Override 
protected void doGet(final HttpServletRequest httpServletRequest, final HttpServletResponse httpServletResponse) throws ServletException, IOException 
{ 
    // Method just to setup the Servlet to understand how it works 

    final String language = "language"; 
    final String path = "/sigbud/language/"; 

    if (httpServletRequest.getParameter(language) != null) 
    { 
     if (httpServletRequest.getParameter(language).equalsIgnoreCase("Nihongo")) 
     { 
      httpServletResponse.sendRedirect(path + "nihongo.jsp"); 
     } 
     else if (httpServletRequest.getParameter(language).equalsIgnoreCase("Eigo")) 
     { 
      httpServletResponse.sendRedirect(path + "eigo.jsp"); 
     } 
     else if (httpServletRequest.getParameter(language).equalsIgnoreCase("Funansugo")) 
     { 
      httpServletResponse.sendRedirect(path + "funansugo.jsp"); 
     } 
     else 
     { 
      httpServletResponse.sendRedirect(path + "unknown.jsp"); 
     } 
    } 
    else 
    { 
     super.doGet(httpServletRequest, httpServletResponse); 
    } 

    loggingTestServiceInterface.logError(getClass(), "Wakarimasen"); 
} 
    @Reference(service = LoggingTestServiceInterface.class, cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC) 
public void bindLoggingTestServiceInterface(final LoggingTestServiceInterface loggingTestServiceInterface) 
{ 
    this.loggingTestServiceInterface = loggingTestServiceInterface; 
} 

public void unbindLoggingTestServiceInterface(final LoggingTestServiceInterface loggingTestServiceInterface) 
{ 
    if (this.loggingTestServiceInterface.equals(loggingTestServiceInterface)) 
    { 
     this.loggingTestServiceInterface = null; 
    } 
} 
@Activate 
public void start(final BundleContext bundleContext) 
{ 
    System.out.println("StartTest Service Taisho"); 
} 

@Deactivate 
public void stop() 
{ 
    System.out.println("Stop Test Service Fukutaisho"); 
} 

@Modified 
public void modify() 
{ 
    System.out.println("Stop Test Service san jyû kyû"); 
} 
} 

сгенерированного XML

<?xml version="1.0" encoding="UTF-8"?> 
<components xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0"> 
<scr:component name="com.sti.sigbud.servlet.Wakarimashita" activate="start" deactivate="stop" modified="modify"> 
    <implementation class="com.sti.sigbud.servlet.Wakarimashita"/> 
    <reference name="LoggingTestServiceInterface" interface="com.sti.loggingservices.serviceinterface.LoggingTestServiceInterface" cardinality="1..1" policy="dynamic" bind="bindLoggingTestServiceInterface" unbind="unbindLoggingTestServiceInterface"/> 
</scr:component> 

Кроме того, я пытался, но не повезло, потому что мой сервлет кажется, не будет найден (ошибка 404 - запрашиваемый ресурс() не доступен.), Чтобы сделать как Питер Крайенс написал там: How to consume OSGi service from OSGi HTTP Service

так что я изменил мой сервлет так:

@Component(service = Servlet.class, property = {"alias=/Wakarimashita"}) 
public class Wakarimashita extends HttpServlet 

Сгенерированный XML является

<?xml version="1.0" encoding="UTF-8"?> 
<components xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0"> 
<scr:component name="com.sti.sigbud.servlet.Wakarimashita" activate="start" deactivate="stop" modified="modify"> 
    <implementation class="com.sti.sigbud.servlet.Wakarimashita"/> 
    <service servicefactory="false"> 
     <provide interface="javax.servlet.Servlet"/> 
    </service> 
    <property name="alias" value="/Wakarimashita"/> 
    <reference name="LoggingTestServiceInterface" interface="com.sti.loggingservices.serviceinterface.LoggingTestServiceInterface" cardinality="1..1" policy="dynamic" bind="bindLoggingTestServiceInterface" unbind="unbindLoggingTestServiceInterface"/> 
</scr:component> 

получить доступ к сервлет из моего JSP

<form action="Wakarimashita" method="GET"> 
     <input type="text" name="language" size="50"/> 
    <input type="submit" value="Submit" /> 
</form> 

Для проверки выше у меня в развернутых пучках org.apache.felix.http.api-2.2.1, org.apache.felix.http. whiteboard-2.2.1, как и в сообщении. Не нашел, есть ли переключатель для включения.

Также я проверил с org.apache.felix.webconsole-4.2.0 все пакеты, и служба работает и работает, он говорит, что мой потребительский пакет использует его.

+0

Wakarimasen deshita ... –

ответ

0

У вас есть две стороны, создающие экземпляры вашего сервлета. Однажды DS, а другой - веб-контейнер. У вас не может быть 2 мастера. Веб-контейнер в основном должен быть ответственным, поскольку он будет отправлять запросы только экземпляру вашего сервлета, который он создает.

Если была реализована реализация, поддерживающая как веб-контейнер, так и DS, тогда вы должны быть установлены. Но я никогда не слышал об этом.

Я не знаю, поддерживает ли Glassfish спецификацию веб-приложения OSGi (Ch 128). Если это так, то вы можете взаимодействовать с уровнем сервиса OSGi, как описано в 128.6.

+0

Здравствуйте, я понял, что столкнулся с двумя контейнерами, управляющими своим кодом. Поскольку кажется, что я использую Glassfish OSGi Web Container, я могу получить доступ к контексту связки через getServletContext(). GetAttributes («osgi-bundle») так же, как и в спецификации, и получить мой сервис оттуда, задавался вопросом, есть ли какая-либо конфигурация где-то в Glassfish или плагин/инструмент или любой другой способ создать мой сервлет, который позволит мне использовать инъекцию – HellDevils

+0

Нет, это либо/или. –

+0

Итак, я получаю доступ к службе, следующей за спецификацией, поэтому из контекста сервлета с помощью getServletContext() getAttributes («osgi-bundle»), чтобы получить ссылку на мой сервис и службу – HellDevils

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

  • Нет связанных вопросов^_^