gpt4 book ai didi

java - WS动态客户端和complexType参数

转载 作者:太空宇宙 更新时间:2023-11-04 07:35:58 24 4
gpt4 key购买 nike

我正在尝试创建动态 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 类导入到客户端)?我是否有可能只传递原始类型的结构(在本例中是带有年龄参数的一个元素结构)?感谢您的任何建议。

最佳答案

如果您不打算为其提供复杂类型,则不能使用 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 手动构造 SOAP 有效负载。这是一个艰苦的方法(确保这是您想要的)。

最终,这两种方法都要求您预先了解 Web 服务调用期间将要处理的类型

关于java - WS动态客户端和complexType参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16871098/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com