Hi Randy,

the code complains that the interface com.sun.xml.internal.ws.developer.WSBindingProvider is not visible. This possibly means that standard JAXWS from the JDK is used to create the service proxy.

I think the reason is that the generated code for the client class uses the JAXWS API. This API by default points to JAXWS from the JDK. It can be overridden by CXF but this is difficult in OSGi and I would suggest to rather avoid this.

So you should try to use the CXF API to create the proxy. Try this:
factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(ServiceInterface.class);
factory.setAddress("http://where your service is located");
myService = factory.create();

This will make sure CXF is used and also take care of the classloading.

The disadvantage is that you directly expose your client code to CXF. So a common pattern is to create a bundle for the client that exports the service proxy as an OSGi service for internal use.

CXF-DOSGi can provide exactly the creation of the proxy and internal OSGi service in a more automatic way. In CXF DOSGi you would do this:
- Install CXF-DOSGi WS provider
- Install your service API bundle with your generated code for the interface
- Install the Aries RSA config based discovery
- Create a config that triggers the creation of the proxy for the remote service

I recommend to first use the approach above and then try with CXF-DOSGi. The nice thing is that from the start your user code will only depend on the service interface and an OSGi service. So switching to DOSGi later will not change any of your code that uses the service.

Many people think DOSGi is just a way to call remote OSGi services while in fact it is also a great solution for providing or accessing plain SOAP and REST services. Once CXF-DOSGi 2 is released I plan to write a tutorial that shows how to use CXF DOSGi to either expose a plain SOAP and REST service or use external SOAP and REST services. Especially for Liferay I think this could become the default way of interacting with the outside world as it matches very well with DS.

Christian

On 14.09.2016 19:49, Randy Leonard wrote:
I have CXF/SOAP services deployed within OSGi enRoute, and can successfully connect via SoapUI. Next is to build a simple OSGi gogo command to invoke these services, then migrate this to Liferay for end-to-end demo.

To this end, am using the following for guidance (but disregarding Liferay components until the shell command works):
http://www.dontesta.it/blog/blog-2/liferay-7-come-realizzare-un-client-soap-apache-cxf-osgi-style/

The instructions given above state I would need the following runtime bundles with my OSGi Command Line Tools bundle:
• Apache XmlSchema Core (v. 2.2.1)
• Apache CXF Core
• Apache CXF Runtime JAXB DataBinding
• Apache CXF Runtime XML Binding
• Apache CXF Runtime SOAP Binding
• Apache CXF Runtime Core for WSDL
• Apache CXF Runtime Simple Frontend
• Apache CXF Runtime JAX-WS Frontend
• Apache CXF Runtime HTTP Transport


It seems quite straightforward, but am getting the following exception when running the OSGi gogo command: interface com.sun.xml.internal.ws.developer.WSBindingProvider is not visible from class loader


My gogo command code appears as follows:

@Component(service = InvolvedPartyFetchCommand.class, property = { Debug.COMMAND_SCOPE + "=party", Debug.COMMAND_FUNCTION + "=fetch" })
public class InvolvedPartyFetchCommand
{
public void fetch()
{
try {
InvolvedPartyService service = new InvolvedPartyService(InvolvedPartyService.WSDL_LOCATION, InvolvedPartyService.SERVICE);
InvolvedPartyPortType port = service.getInvolvedPartySoap12Endpoint();

System.out.println("Invoking involvedPartyFetch...");
InvolvedPartyFetchRequest request = new InvolvedPartyFetchRequest();
InvolvedPartyFetchResponse response = port.involvedPartyFetch(request);
System.out.println("involvedPartyFetch.result="+ response);
} catch (Throwable e) {
e.printStackTrace();
}
}

}


And my bndrun file for the OSGi command project is as follows:

#
# LAUNCH SPECIFICATION
#


Bundle-Version:1.0.0.${tstamp}
Bundle-SymbolicName:com.rps.masterdata.party.soapClient.launch
JPM-Command:sopclnt


-runrequires:  \
osgi.identity;filter:='(osgi.identity=org.apache.felix.gogo.shell)',\
osgi.identity;filter:='(osgi.identity=org.apache.cxf.cxf-core)',\
osgi.identity;filter:='(osgi.identity=org.apache.cxf.cxf-rt-bindings-soap)',\
osgi.identity;filter:='(osgi.identity=org.apache.cxf.cxf-rt-bindings-xml)',\
osgi.identity;filter:='(osgi.identity=org.apache.cxf.cxf-rt-databinding-jaxb)',\
osgi.identity;filter:='(osgi.identity=org.apache.cxf.cxf-rt-frontend-simple)',\
osgi.identity;filter:='(osgi.identity=org.apache.cxf.cxf-rt-frontend-jaxws)',\
osgi.identity;filter:='(osgi.identity=org.apache.cxf.cxf-rt-transports-http)',\
osgi.identity;filter:='(osgi.identity=org.apache.cxf.cxf-rt-wsdl)',\
osgi.identity;filter:='(osgi.identity=org.apache.ws.xmlschema.core)',\
osgi.identity;filter:='(osgi.identity=com.rps.masterdata.party.soapClient.provider)',\
osgi.identity;filter:='(osgi.identity=com.rps.masterdata.party.soapClient.command)'

-runbundles: \
com.rps.foundation.soapClient.provider;version=snapshot,\
com.rps.masterdata.party.soapClient.command;version=snapshot,\
com.rps.masterdata.party.soapClient.provider;version=snapshot,\
org.apache.cxf.cxf-core;version='[3.1.6,3.1.7)',\
org.apache.cxf.cxf-rt-bindings-soap;version='[3.1.6,3.1.7)',\
org.apache.cxf.cxf-rt-bindings-xml;version='[3.1.6,3.1.7)',\
org.apache.cxf.cxf-rt-databinding-jaxb;version='[3.1.6,3.1.7)',\
org.apache.cxf.cxf-rt-frontend-jaxws;version='[3.1.6,3.1.7)',\
org.apache.cxf.cxf-rt-frontend-simple;version='[3.1.6,3.1.7)',\
org.apache.cxf.cxf-rt-transports-http;version='[3.1.6,3.1.7)',\
org.apache.cxf.cxf-rt-wsdl;version='[3.1.6,3.1.7)',\
org.apache.felix.configadmin;version='[1.8.6,1.8.7)',\
org.apache.felix.gogo.runtime;version='[0.16.2,0.16.3)',\
org.apache.felix.gogo.shell;version='[0.10.0,0.10.1)',\
org.apache.felix.http.servlet-api;version='[1.1.2,1.1.3)',\
org.apache.felix.log;version='[1.0.1,1.0.2)',\
org.apache.felix.scr;version='[2.0.0,2.0.1)',\
org.apache.servicemix.bundles.wsdl4j;version='[1.6.3,1.6.4)',\
org.apache.ws.xmlschema.core;version='[2.2.1,2.2.2)',\
org.eclipse.equinox.metatype;version='[1.4.100,1.4.101)',\
org.osgi.service.metatype;version='[1.3.0,1.3.1)'




I've seen a number of posts on this issue, but I have such a vanilla setup that solutions provided elsewhere don't seem applicable here. Suggestions are certainly appreciated.

Thanks, Randy




_______________________________________________
OSGi Developer Mail List
osgi-dev@mail.osgi.org
https://mail.osgi.org/mailman/listinfo/osgi-dev


--
Christian Schneider
http://www.liquid-reality.de

Open Source Architect
http://www.talend.com

_______________________________________________
OSGi Developer Mail List
osgi-dev@mail.osgi.org
https://mail.osgi.org/mailman/listinfo/osgi-dev

Reply via email to