1

私はWebサービスの初心者です。私の要件には WSDL リンクが与えられています

  1. サポートされているすべての操作を動的に検索したい (WSDL で公開されているメソッド)
  2. リストされたさまざまな操作を繰り返します
  3. パラメータのリストを動的に取得し、これらの操作ごとに値を返します
  4. 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;

    }

}
4

1 に答える 1

0

wsdl2java-tool (axis2-zip にパッケージ化されています) を使用して、指定された WSDL からスタブ コードをコンパイルする必要があります。次に、すべてのメソッド、パラメーターを含む Web サービス関連のクラスをすぐに見つけることができます。

例については、こちらの ステップ 5を参照してください。

于 2012-10-22T11:49:17.710 に答える