Настройка гессиана службы в карафе с пружиной дм

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

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

Я уже представил сервис через CXF, и теперь я пытаюсь представить тот же сервис, что и сервис Гессиана.

Войны или web.xml нет, просто бобы + 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, но я получаю не найден WebApplicationContext: не зарегистрирован зарегистрирован ContextLoaderListener?,

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

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

и здесь кроется проблема, так как отсутствует пружинный 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, похоже, что я должен объявить и указать бин GenericWebApplicationContext, но я не знаю, как "соединить" этот бин с требуемым HttpContext для OSGi.

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.

Другие вопросы по тегам