2012-10-22 143 views
1

我是web服務的新手。我的要求是給定一個WSDL鏈接動態客戶端WSDL

  1. 我要動態地找到支持(通過WSDL公開的方法 )
  2. 迭代雖然不同的操作上市
  3. 動態獲取參數列表和返回值的所有操作對於這些操作的
  4. 獲得操作名稱,帕拉姆的細節後動態消費服務,並返回

我能編寫一個動態客戶端應用程序(Axis 2,WSDL4J),它將使用WSDL並給出方法Name,爲該方法定義的參數,數據類型等。 我創建了一個應用程序,該應用程序正在採用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; 

    } 

} 

回答

0

你需要從與WSDL2Java的工具(它打包在Axis2的-ZIP)給定的WSDL編譯存根代碼。 然後你會發現你的web服務相關的類包括所有的方法,參數爲你準備好。請參閱Step 5 here