С окружающей средой:
- Караф 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. .