1

動的 WS クライアントを作成しようとしていますが、ComplexType パラメーターを使用した WS 操作で問題が発生しました。次に例を示します。

ウェブサービス:

@WebMethod
public int testPerson(Person a) {
  return a.getAge();
}



class Person {
    private int age;

    public Person() {
    }

    public Person(int i) {
        this.age = i;
    };

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

そして、これが私がWSを呼び出す方法です:

Client c = JaxWsDynamicClientFactory.newInstance().createClient("wsdlPath");
c.invoke("testPerson",...);

わかりました、私の質問は、この WebService を呼び出すためにどのパラメーターを渡す必要があるかです (クライアントは動的でなければならないので、クラス Person をクライアントにインポートできないと言いました)。プリミティブ型の構造体 (この場合は age パラメーターを持つ 1 つの要素構造体) だけを渡すことは可能ですか? ご提案ありがとうございます。

4

1 に答える 1

1

JaxWsDynamicClientFactory複雑な型を提供するつもりがない場合は使用できません

Personまた、技術的には、型をクライアントにインポートする必要はありません。本当に必要なのは、型を認識し、リフレクションを使用して実行時にクラスのインスタンスを生成することだけです。

ここで使用したバージョンはcreateClient、単純な型を受け入れる Web サービス操作にのみ適しています。複合型を動的 Web サービス クライアントに渡すことができるようにするには、

  1. JaxWsDynamicClientFactory以下を使用して、必要なサポート クラスを動的に生成する必要があります。

    ClassLoader loader = this.getClass().getClassLoader();
    JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
    Client client = dcf.createClient("wsdlPath", classLoader);
    

    これにより、Clientオブジェクトと必要な pojo が作成されます。

  2. 次に、次の方法でサービスを呼び出すことができます。

    //Dynamically load an instance of the Person class. You're not importing and you can simply configure the class name as an application property
    Object person = Thread.currentThread().getContextClassLoader().loadClass("foo.bar.Person").newInstance(); 
    Method theMethod = person.getClass().getMethod("setAge", Integer.class);
    theMethod.invoke(person, 55); //set a property
    
    client.invoke("testPerson", person); //invoke the operation.
    

上記のアプローチを除いて、他の唯一の代替手段は、Dispatch API. これは骨の折れるアプローチです (それがあなたが望むものであることを確認してください)。

最終的には、どちらのアプローチでも、Web サービスの呼び出し中に処理するタイプについてある程度の知識が必要です。

于 2013-06-02T18:07:14.367 に答える