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 导入客户端)?我是否有可能只传递原始类型的结构(在这种情况下是一个带有年龄参数的元素结构)?感谢您的任何建议。

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 回答