用于构建XML请求的架构?

时间:2014-01-21 21:27:45

标签: java xml web-services soap

我正在编写一个使用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对象,而是尝试以某种方式封装许多其他部分,那么您更喜欢哪种方法,以便不是一个类正在爆炸?

1 个答案:

答案 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中定义数据结构。

祝你好运,

罗德尼巴尔巴蒂

相关问题