私はWebサービスの初心者です。私の要件には WSDL リンクが与えられています
- サポートされているすべての操作を動的に検索したい (WSDL で公開されているメソッド)
- リストされたさまざまな操作を繰り返します
- パラメータのリストを動的に取得し、これらの操作ごとに値を返します
- Operation Name、Param、return の詳細を取得した後、Service を動的に消費する
WSDL を使用し、メソッド名、メソッドに定義されたパラメーター、データ型などを指定する動的クライアント アプリケーション (Axis 2、WSDL4J) を作成できます。WSDL を取得して提供するアプリケーションを作成しました。 WSDL に存在するすべてのメソッド。
Definition def = reader.readWSDL(null, wsdlURI);
Map services = def.getServices();
// Services when Iterated will give all the Method Names
// .......
Operation operation = boperation.getOperation();
String OperationName = operation.getName();
System.out.println("OperationName :" + OperationName.toString());
これを超えて、特定のメソッドのパラメーター名を動的に取得する方法がわかりません。サンプルコード/チュートリアルは大歓迎です
クライアント用の完全なコードが添付されています。
public class DynamicInvoke {
public static void main(String[] args) throws WSDLException {
String wsdlURI = "WORKING_WSDL_LINK";
DynamicInvoke di = new DynamicInvoke();
List wsdlList = new ArrayList();
wsdlList = di.buildComponents(wsdlURI);
}
public List buildComponents(String wsdlURI) throws WSDLException {
// The list of components that will be returned
List serviceList = Collections.synchronizedList(new ArrayList());
// Create the WSDL Reader object
WSDLFactory factory = WSDLFactory.newInstance();
WSDLReader reader = factory.newWSDLReader();
try {
// Read the WSDL and get the top-level Definition object
Definition def = reader.readWSDL(null, wsdlURI);
java.util.Map<QName, Service> services = null;
// Get the services defined in the document
try {
services = def.getServices();
} catch (Exception e) {
System.out.println("Cast Exception " + e.getMessage());
}
if (services != null) {
// Create a component for each service defined
Iterator serviceIter = (services).values().iterator();
for (int i = 0; serviceIter.hasNext(); i++) {
// Create a new ServiceInfo component for each service found
ServiceInfo serviceInfo = new ServiceInfo();
// Populate the new component from the WSDL Definition read
populateComponent(serviceInfo, (Service) serviceIter.next());
// Add the new component to the List to be returned
serviceList.add(serviceInfo);
}
}
}
catch (Throwable t) {
// Process the error/exception
System.err.println(t.getMessage());
}
// return the List of services we created
return serviceList;
}
private ServiceInfo populateComponent(ServiceInfo component, Service service)
throws WSDLException {
// Get the qualified service name information
QName qName = service.getQName();
// Get the service's namespace URI
String namespace = qName.getNamespaceURI();
// Use the local part of the qualified name for the component's name
String name = qName.getLocalPart();
// Get the defined ports for this service
Map ports = service.getPorts();
// Use the Ports to create methods for all request/response messages
// defined
Iterator portIter = ports.values().iterator();
while (portIter.hasNext()) {
// Get the next defined port
Port port = (Port) portIter.next();
// Get the Port's Binding
javax.wsdl.Binding binding = port.getBinding();
// Now we will create operations from the Binding information
List operations = buildOperations(binding);
// Process methods built from the binding information
Iterator operIter = operations.iterator();
while (operIter.hasNext()) {
BindingOperation boperation = (BindingOperation) operIter.next();
Operation operation = boperation.getOperation();
// Get all the QName,Port Name,Name Space, WebService Name...
System.out.println("Port Name =" + port.getName());
System.out.println("QName = " + qName.toString());
System.out.println("Namespace = " + namespace.toString());
System.out.println("WebService Name = " + name.toString());
// Get All the Method Name...
String OperationName = operation.getName();
System.out.println("OperationName :" + OperationName.toString());
Input inDef = operation.getInput();
String ParamName = inDef.getName();
System.out.println("inDef--->" + ParamName);
Message inMessage = inDef.getMessage();
Map parts = inMessage.getParts();
System.out.print("\nAxis parameters gathered:\nTargetNamespace = " +"\n"+
"Service Name = "+namespace.toString() +"\n"+
"Port Name = "+port.getName() +"\n"+
"Operation Name = "+operation.getName()+"\n"+
"Input Parameters = ");
}
}
return component;
}
private List buildOperations(Binding binding) {
// TODO Auto-generated method stub
List list = binding.getBindingOperations();
System.out.println("Bindings :" + list);
return list;
}
}