CXF WebService Dynamic Client
5393 ワード
すなわち、実行中にメモリに動的にClient(SEIとData Class)を生成する.CXFにはJaxWsDynamicClientFactoryが用意されています.
Dynamic Client.
完全コードリファレンス添付ファイル:webservice-sample.zip
1.簡単なDynamic Clientを作成する
出力の実行:
2. Using the CXF service model for building dynamic client
出力の実行:
Dynamic Client.
完全コードリファレンス添付ファイル:webservice-sample.zip
1.簡単なDynamic Clientを作成する
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import org.apache.cxf.endpoint.Client;
import java.lang.reflect.Method;
public class OrderProcessJaxWsDynamicClient {
public OrderProcessJaxWsDynamicClient() {
}
public static void main(String str[]) throws Exception {
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient("http://localhost:8080/OrderProcess?wsdl");
Object order = Thread.currentThread().getContextClassLoader().loadClass("org.pcdp.sample.webservice.server.Order").newInstance();
Method m1 = order.getClass().getMethod("setCustomerID", String.class);
Method m2 = order.getClass().getMethod("setItemID", String.class);
Method m3 = order.getClass().getMethod("setQty", Integer.class);
Method m4 = order.getClass().getMethod("setPrice", Double.class);
m1.invoke(order, "C001");
m2.invoke(order, "I001");
m3.invoke(order, 100);
m4.invoke(order, 200.00);
Object[] response = client.invoke("processOrder", order);
System.out.println("Response is " + response[0]);
}
}
出力の実行:
: Created classes: org.pcdp.sample.webservice.server.ObjectFactory, org.pcdp.sample.webservice.server.Order, org.pcdp.sample.webservice.server.ProcessOrder, org.pcdp.sample.webservice.server.ProcessOrderResponse
Response is ORD1234
2. Using the CXF service model for building dynamic client
import java.beans.PropertyDescriptor;
import java.util.List;
import javax.xml.namespace.QName;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import org.apache.cxf.service.model.BindingInfo;
import org.apache.cxf.service.model.BindingMessageInfo;
import org.apache.cxf.service.model.BindingOperationInfo;
import org.apache.cxf.service.model.MessagePartInfo;
import org.apache.cxf.service.model.ServiceInfo;
public class OrderProcessJaxWsDynClient {
public OrderProcessJaxWsDynClient() {
}
public static void main(String str[]) throws Exception {
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient("http://localhost:8080/OrderProcess?wsdl");
Endpoint endpoint = client.getEndpoint();
// Make use of CXF service model to introspect the existing WSDL
ServiceInfo serviceInfo = endpoint.getService().getServiceInfos().get(0);
QName bindingName = new QName("http://server.webservice.sample.pcdp.org/","OrderProcessServiceSoapBinding");
BindingInfo binding = serviceInfo.getBinding(bindingName);
QName opName = new QName("http://server.webservice.sample.pcdp.org/", "processOrder");
BindingOperationInfo boi = binding.getOperation(opName); // Operation name is processOrder
BindingMessageInfo inputMessageInfo = null;
if (!boi.isUnwrapped()) {
// OrderProcess uses document literal wrapped style.
inputMessageInfo = boi.getWrappedOperation().getInput();
} else {
inputMessageInfo = boi.getUnwrappedOperation().getInput();
}
List<MessagePartInfo> parts = inputMessageInfo.getMessageParts();
MessagePartInfo partInfo = parts.get(0); // Input class is Order
// Get the input class Order
Class<?> orderClass = partInfo.getTypeClass();
Object orderObject = orderClass.newInstance();
// Populate the Order bean
// Set customer ID, item ID, price and quantity
PropertyDescriptor custProperty = new PropertyDescriptor("customerID",orderClass);
custProperty.getWriteMethod().invoke(orderObject, "C001");
PropertyDescriptor itemProperty = new PropertyDescriptor("itemID",orderClass);
itemProperty.getWriteMethod().invoke(orderObject, "I001");
PropertyDescriptor priceProperty = new PropertyDescriptor("price",orderClass);
priceProperty.getWriteMethod().invoke(orderObject,Double.valueOf(100.00));
PropertyDescriptor qtyProperty = new PropertyDescriptor("qty",orderClass);
qtyProperty.getWriteMethod().invoke(orderObject, Integer.valueOf(20));
// Invoke the processOrder() method and print the result
// The response class is String
Object[] result = client.invoke(opName, orderObject);
System.out.println("The order ID is " + result[0]);
}
}
出力の実行:
: Created classes: org.pcdp.sample.webservice.server.ObjectFactory, org.pcdp.sample.webservice.server.Order, org.pcdp.sample.webservice.server.ProcessOrder, org.pcdp.sample.webservice.server.ProcessOrderResponse
The order ID is ORD1234