良好的JAXB设计模式包装模型和/或转换模型(POJO)?

时间:2011-10-25 21:21:53

标签: design-patterns jaxb

我有以下型号

class MyClass {
    id
    someRandomString
}

我想将此POJO作为...

返回给客户
<Root>
    <random>if + randomstring</random>
</Root>

基本上我正在处理面向消息的服务,所以我需要将模型换行并转换为出站XML格式......输入端也是如此

我有这个XML ......

<Root>
    <Username>
    <Password>
    <Action> <-- Some action or service to perform
    <SomeModel1>
    <SomeModel2>
</Root>

因此,根,用户名和密码是常量元素,而SomeModel可以根据“服务”进行更改

Bassically我正在寻找一种设计模式,其中XML与模型不匹配,需要进行转换...

或者,如果我做了......

class MyClass {
    id
    someRandomString
    random

    @XMLTransient
    getId()


    @XMLTransient
    getSomeRandomString()


    getRandom() {
        return id + someRandomString
    }
}

所以JAXB只会映射getRandom ...

我的另一个想法是创建一堆代表最终输出的类,然后将值设置为thoses ......

所以

class MyResponse {
    randomString
    status
    someOtherFieldRequired in response
}    

然后我可以做......

myResponse.setRandomString(myClass.getId() + myClass.getSomeRandomString());

2 个答案:

答案 0 :(得分:1)

您可以将XmlAdapterXmlJavaTypeAdapter结合使用,但我认为可能需要您将id和someRandomString属性封装到单独的类中。如果可能的话,直接在两个单独的bean属性上扩展元素值并不是我知道该怎么做的。

答案 1 :(得分:1)

您可以idsomeRandomString字段分隔元素并使用样式表将元素合并为一个元素。 JAXB提供适合JAXBSource API的javax.xml.transform类:

MyClass myClass = new MyClass();
myClass.setId(123);
myClass.setSomeRandomString("FOO");

TransformerFactory tf = TransformerFactory.newInstance();
StreamSource xslt = new StreamSource(new FileInputStream("my-xslt.xml"));
Transformer t = tf.newTransformer(xslt);

JAXBContext jc = JAXBContext.newInstance(MyClass.class);
JAXBSource source = new JAXBSource(jc, myClass);

StreamResult result = new StreamResult(System.out);

t.transform(source, result);