Настройка гессенского сервиса в karaf с помощью spring dm

С окружающей средой:

  • Караф 3.0.1
  • Весна 3.2.4
  • Гессен 4.0.33

Я уже предоставил услугу через CXF, и теперь я пытаюсь предоставить ту же услугу в качестве службы Hessian.

Нет войны или web.xml, просто bean-компоненты + pax-http, и я пробовал следующее:

<bean name="/hessian" class="org.springframework.remoting.caucho.HessianServiceExporter">
    <property name="service" ref="promocionalOnLineWebServiceBean"/>
    <property name="serviceInterface" value="org.fideliapos.promos.webservice.PromocionalOnLineFacade"/>
</bean> 
...
<bean id="hessianServlet" class="org.springframework.web.context.support.HttpRequestHandlerServlet"/>
...
<osgi:service ref="hessianServlet" interface="javax.servlet.http.HttpServlet">
    <service-properties>
        <entry key="alias" value="/hessian"/>
    </service-properties>         
</osgi:service>

Идея состоит в том, чтобы зарегистрировать сервлет (HttpRequestHandlerServlet), целью которого является HessianServiceExporter, но я получаю сообщение No WebApplicationContext found: no ContextLoaderListener зарегистрирован?.

Я проследил код весны, и внутренний причал распознал сервлет и вызвал его метод инициализации:

@Override
public void init() throws ServletException {
    WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
    this.target = wac.getBean(getServletName(), HttpRequestHandler.class);
}

и здесь кроется проблема, так как нет Spring WebApplicationContext и целевое свойство не может быть введено.

Я что-то пропустил? или это невозможно заставить работать так.

В качестве обходного пути я рассматриваю возможность расширения сервлета своей собственной реализацией (setTarget и т. д.), но я бы предпочел этого не делать.


ОБНОВИТЬ

После попытки создать и добавить свой собственный HttpContext все еще чего-то не хватает:

Я реализовал свой собственный HttpContext:

public class HessianContext implements HttpContext{
...
}

добавил фасоль

<bean id="hessianContext" class="org.fideliapos.promos.hessian.HessianContext"/>

сервис:

<osgi:service id="hessianContextService" ref="hessianContext" interface="org.osgi.service.http.HttpContext">
    <service-properties>
        <entry key="httpContext.id" value="hessian"/> <!-- also tried with contextId-->
    </service-properties>
</osgi:service>     

и, наконец, сервлет как сервис:

<osgi:service ref="hessianServlet" interface="javax.servlet.http.HttpServlet">
    <service-properties>
        <entry key="alias" value="/hessian"/>
        <entry key="httpContext.id" value="hessian"/> <!-- also tried with contextId-->      
    </service-properties>         
</osgi:service>

Поскольку метод init ищет WebApplicationContext, похоже, что я должен объявить и явно указать bean-компонент GenericWebApplicationContext, но я не знаю, как "присоединить" этот bean-компонент к требуемому HttpContext для OSGi. .


person Ivan Arrizabalaga    schedule 09.03.2015    source источник


Ответы (1)


Похоже, вам нужно добавить Spring WebApplicationContext в HttpContext, используемый для вашего сервлета. Прямо сейчас вы используете DefaultHttpContext Pax Web. В вашем случае вам нужно будет зарегистрировать пользовательский HttpContext, который знает о материалах Spring, чтобы WebApplicationContextUtils.getRequireWebApplicationContext мог извлекать эту информацию. Для этого вам необходимо зарегистрировать свой пользовательский HttpContext как службу и сослаться на него в своем сервлете, полный пример этого с использованием Blueprint (аналогично spring) можно найти здесь

Ниже приводится отрывок из него:

<service id="forbiddenCtxtService" ref="forbiddenContext" interface="org.osgi.service.http.HttpContext">
    <service-properties>
        <entry key="httpContext.id" value="forbidden"/>
    </service-properties>
</service>

Важной частью является httpContext.id

<bean id="forbiddenServlet" class="org.ops4j.pax.web.extender.samples.whiteboard.internal.WhiteboardServlet">
    <argument type="java.lang.String" value="/forbidden"/>
</bean>

<service id="forbiddenServletService" ref="forbiddenServlet" interface="javax.servlet.Servlet">
    <service-properties>
        <entry key="alias" value="/forbidden"/>
        <entry key="httpContext.id" value="forbidden"/>
    </service-properties>
</service>

Опять же, здесь зарегистрированный сервлет имеет конфигурацию для соответствующего httpContext.id, это привязывает этот сервлет к ранее зарегистрированному HttpContext.

person Achim Nierbeck    schedule 10.03.2015