我正在编写一个使用soap xml webservices的客户端工具(使用CXF从提供的wsdl自动生成类)。我想知道哪种设计最适合构建我想发送给webservices的xml请求。我的问题是要发送的请求必须由许多不同的部分/对象组成。我正在寻找一种如何构建这些部件的简洁方法,最终形成完整的请求。
请求可能会增长到200-500个XML行,因此在单个类中创建所有这些可能是个坏主意。
为了说明我的目标,让我们假设一个请求需要一个Person
对象,并且必须在该对象上设置一些参数,如姓名,生日,地址等。我可以想到以下设计:
1)返回构造的xml部分的静态实用程序
class XMLUtil {
public static PersonType createPerson(String name, String birthday, Address Address) {
//the xml person to send within the request
PersonType p = new PersonType();
p.setName(name);
p.setBirthday(birthday);
p.setAddress(address);
//assume some more params, but the concept is clear I hope
return p;
}
}
2)静态实用程序,它将构造的xml部分添加到xml请求
class XMLUtil {
public static void addPerson(WebserviceReq req, String name, String birthday, Address Address) {
//create person as above
req.addPerson(p);
}
}
3)非静态服务
class XMLService {
private WebserviceReq req;
public XMLService(WebserviceReq req) {
this.req = req;
}
public void createPerson(String name, String birthday, Address Address) {
//create person as above
req.addPerson(p);
}
public WebserviceReq getWebserviceReq() {
return req;
}
}
用法:
1)
WebserviceReq req = new WebserviceReq();
req.addPerson(XMLUtil.createPerson("test", "2014-01-01", address));
req.send();
2)
WebserviceReq req = new WebserviceReq();
XMLUtil.addPerson(req, "test", "2014-01-01", address);
req.send();
3)
WebserviceReq req = new WebserviceReq();
XMLService service = new XMLService(req);
service.createPerson("test", "2014-01-01", address);
service.getWebserviceReq();
req.send();
如果不仅要为xml请求构造一个person对象,而是尝试以某种方式封装许多其他部分,那么您更喜欢哪种方法,以便不是一个类正在爆炸?
答案 0 :(得分:0)
我所做的和多次使用的效果如下......
为XML中的每个元素类型创建一组类 - 这包括以下内容......
节点 - 所有元素的基类。支持设置和获取属性。 Leaf - 包含值的任何元素的基类(简单元素) Branch - Leaf元素的集合。儿童可通过索引访问。 实体 - 允许对其子项进行键控访问的分支。
至于反对你现在是如何做的,那就是你有一个名为Person Bean上具有私有变量,需要代码来设置和获取每一个值,你可以使用一个实体实例,并添加叶实例它,例如。 ..
Entity person = new Entity("Person");
person.add(new Leaf<String>("FirstName", "Rodney"));
person.add(new Leaf<String>("LastName", "Barbati"));
这里的强大功能来自于添加基类将自己编写为XML的能力。这使您能够快速创建新类型,而不必编写代码将其转换为XML。
您还可以通过从Entity派生person类并在其构造函数中添加子元素来使其完全透明。我还建议你添加一个验证方法,检查每个所需孩子的存在和正确的格式。
Java中提供了用于处理XML元素的类,但它们有些麻烦并且不易使用。您可以考虑将它们包装起来或从它们派生,以使它们更容易使用。
在上面给你的能力来输出XML容易,而无需样板代码 - 如果你有一个自定义的SAX解析器可以构建一个给定的类给定元素嫁了吧,你有高速完整的基础上,流XML服务只需很少的代码就可以立即支持新的数据类型 - 通常都没有。
如果您发现自己编写自定义代码以输出任何XML结构,请了解您不需要 - 有更好的解决方案。
BTW:上面的类很适合在Spring中定义数据结构。
祝你好运,
罗德尼巴尔巴蒂