Dynamic Invocation Interface - DII
If the recommended J2EE Application Client methodology cannot be used by your application, there is a less portable alternative available. Instead of looking up a preconfigured javax.xml.rpc.Service object from JNDI, a client can use the dynamic invocation interface (DII) to connect to a remote web service.
private final String WSDL_LOCATION = "http://localhost:8080/ws4ee/services/HelloWsService?wsdl"; private String NAMESPACE = "http://test.jboss.org/ws4eesimple"; private final QName SERVICE_NAME = new QName(NAMESPACE, "HelloWsService"); public void testSayHello() throws Exception { ServiceFactory serviceFactory = ServiceFactory.newInstance(); Service service = serviceFactory.createService(new URL(WSDL_LOCATION), SERVICE_NAME); Call call = (Call) service.createCall(new QName(NAMESPACE, "HelloPortComponent"), "sayHello"); String retstr = (String) call.invoke(new Object[]{"Hello"}); assertEquals("'Hello' to you too!", retstr); }
Note, in the example above we use a plain JAXRPC javax.xml.rpc.ServiceFactory which has no notion of WS4EE deployment artifacts like jaxrpc-mapping.xml.
As a result mapping meta data is missing and some complex types may not have
serializers/deserializers associated with them.
We provide a proprietary createService method in org.jboss.webservice.client.ServiceFactoryImpl that can take the additional ws4ee descriptors.
/** * Create a Service instance. * * Note, this method is not in the {@link ServiceFactory} interface, it provides the service * with additional ws4ee wsdl/java mapping information * * @param wsdlLocation URL for the WSDL document location * @param jaxrpcLocation An optional URL for the jaxrpc-mapping.xml location * @param ws4eeLocation An optional URL for the ws4ee-deployment.xml location * @param serviceName QName for the service. * @param portName An optional port name * @return Service. * @throws ServiceException If any error in creation of the * specified service */ public Service createService(URL wsdlLocation, URL mappingLocation, URL ws4eeMetaData, QName serviceName, String portName) throws ServiceException
Applying this to the example above, the code would change to
public void testSayHello() throws Exception { ServiceFactoryImpl serviceFactory = (ServiceFactoryImpl)ServiceFactory.newInstance(); Service service = serviceFactory.createService(wsdlURL, jaxrpcURL, ws4eeURL, SERVICE_NAME, null); Call call = (Call) service.createCall(new QName(NAMESPACE, "HelloPortComponent"), "sayHello"); String retstr = (String) call.invoke(new Object[]{"Hello"}); assertEquals("'Hello' to you too!", retstr); }
Comments