Настройка гессиана службы в карафе с пружиной дм
С окружающей средой:
- Караф 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.