我目前正在开发的项目是一个Web应用程序(主要是Web服务,而不是JSP或类似的东西),它作为来自前端的旧界面(它暴露了一对夫妇的网页)之间的“façade”。 Web服务to)和底部更复杂的界面(使用Web服务来调用它们)。
底部的许多Web服务都有相当复杂的结构(标准的一部分,我无法改变)。
在这种情况下我喜欢做的是创建简单的JAXB POJO并使用XSLT将它们转换为复杂的结构。
例如:
@XmlRootElement(name = "simplequery", namespace="http://www.foo.com")
@XmlAccessorType(XmlAccessType.FIELD)
public class SimpleQuery {
@XmlElement(name = "id")
private String name;
public void setId(String id) {
this.id = id;
}
}
我可以这样称呼它:
SimpleQuery sq = new SimpleQuery();
sq.setId("12264736376374");
org.w3c.dom.Document sqDoc = new XsltTransformer("SimpleQuery-to-VeryComplexQuery.xsl").transform();
QueryConsumer.sendQuery(sqDoc);
你只需假设这些课程存在并按照你的想法去做。
以下是我的示例XSLT的相关摘录:
<template match="foo:simplequery">
<some><complex><structure><id><x:value-of select="foo:id"/></id></structure></complex></some>
</template>
我喜欢这样做有两个原因:
我不需要用复杂的JAXB对象创建可怕的(我喜欢称之为)“金字塔代码”:
Some s = new Some();
s.setComplex(new Complex());
s.getComplex().setStructure(new Structure());
s.getComplex().getStructure().setId(new Id());
s.getComplex().getStructure().getId().setValue("1222333232");
时间到了这一点。有几个复杂的接口指向不同的Web服务甚至是服务器,它们都在各自的命名空间中。
在一些重构OCD期间,我想放置这部分:
SimpleQuery sq = new SimpleQuery();
sq.setId("12264736376374");
org.w3c.dom.Document sqDoc = new XsltTransformer("SimpleQuery-to-VeryComplexQuery.xsl").transform();
...使用静态方法进入特定的静态类。
现在面临挑战:为该课程找一个好名字!
该类的作用非常简单:它采用简化对象并将其转换为复杂对象。因此,我的Conveyor Belt
模式。在这种情况下,它只是吐出DOM文档,但它也可能创建JAXB对象,这些对象是该文档的JAXB版本(我的XsltTransformer已经可以这样做了)。
我尝试过像ComplexQueryFactory
这样的名字,但它似乎不对。