我必须编写一个可以远程访问的服务。我正在使用 cxf-dosgi-ri-singlebundle-distribution-1.4.0 。因此,我使用以下属性创建了 API,然后是实现:
Dictionary<String, String> restProps = new Hashtable<String, String>();
restProps.put("service.exported.interfaces", "*");
restProps.put("service.exported.configs", "org.apache.cxf.ws");
restProps.put("org.apache.cxf.ws.address", "http://192.168.0.3:9090/preview");
bundleContext.registerService(Preview.class.getName(), new PreviewService(),restProps);
如果我部署捆绑包(在部署 api 和 d-osgi jar 之后),我可以在浏览器中看到 WSDL,甚至可以从远程计算机上看到。“ http://192.168.0.3:9090/preview?wsdl ” 像这样。
但随之而来的是消费者。客户端 jar 中有 OSGI-INF/remote-service/remote-services.xml:
<endpoint-descriptions xmlns="http://www.osgi.org/xmlns/rsa/v1.0.0">
<endpoint-description>
<property name="objectClass">
<array>
<value>com.liferay.preview.api</value>
</array>
</property>
<property name="endpoint.id">http://192.168.0.3:9090/preview</property>
<property name="service.imported.configs">org.apache.cxf.ws</property>
</endpoint-description>
</endpoint-descriptions>
我可以部署包(在部署 d-osgi 包和 API 之后),但我总是得到空引用。教程总是使用这样的代码
st = new ServiceTracker(bundleContext, MyService.class.getName(), null) {
@Override
public Object addingService(ServiceReference reference) {
Object svc = bundleContext.getService(reference);
if (svc instanceof MyService) {
printServiceInfo((MyService) svc);
}
return super.addingService(reference);
}
};
st.open();
但我使用的是 Liferay 7,我不能使用它(没有 ServiceTracker 的构造函数 - 我只能从 Registry 实例中获取 ServiceTracker 实例)
OSGi 容器是 Felix。
我在某处读过它,如果我可以访问上面看到的 WSDL 描述,假设我的 API 中有一个方法 hello(),然后是一个“ http://192.168.0.3:9090/preview/hello " call 应该可以工作......但它没有。我什至不知道,如何调试这个。(没有远程的东西,在本地,在同一个容器中,方法调用正在工作)
任何帮助都会很好!谢谢!