构建XML请求的体系结构?

问题描述:

我在写一个客户端工具,它使用soap xml webservices(使用CXF从提供的wsdl自动生成类)。我不知道哪个设计最适合构建我想发送给web服务的xml请求。我的问题是要发送的请求必须由许多不同的部分/对象组成。我正在寻找一种干净的方式来构建这些部分的创建,最终形成完整的请求。构建XML请求的体系结构?

该请求可能会增加到200-500个XML行,因此在单个类中创建这些请求可能不是个好主意。

为了说明我的目标,让我们假设一个请求需要一个Person对象,有些PARAMS必须是对象,如姓名,生日,地址等我想到了以下设计的设定:

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请求构造人物对象,而且还尝试以某种方式封装更多的部分,那么您会更喜欢哪种方法,以便没有一个类别被炸毁?

我做了什么,并多次使用有很大的影响如下...

每个XML中的元素类型的创建一组类 - 这包括以下...

节点 - 所有元素的基类。支持设置和获取属性。 叶 - 任何包含值的元素的基类(简单元素) 分支 - Leaf元素的集合。儿童通过索引访问。 实体 - 允许对子项进行密钥访问的分支。

与您现在的做法相反,您有一个名为Person的bean,它具有私有变量并需要代码来设置和获取每个值,您可以使用Entity实例并向其添加叶实例,例如...

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结构,请理解您不必 - 有更好的解决方案。

顺便说一句:上面的类将很适合在Spring中定义数据结构。

好运,

罗德尼巴尔巴蒂一般

+0

好主意,但我必须根据从Web服务提供的WSDL自动生成web服务类。 Usig你的方法,我不得不进一步创建一个包装类为我想要使用的生成的类... – membersound

+1

是的,这是真的 - 你也必须编写一个新的类,以提供任何功能,因为你生成的类实际上并没有任何功能。在那些类中,你将不得不明确地引用你生成的类的所有数据成员。 – user3221160