2011-10-25 47 views
2

我有以下型号良好的JAXB设计模式来包装模型和或转换模型(POJO)?

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 ...

另一个想法我已经是CRE吃了一堆类,将代表最终的输出,只是设置的值放入系统...

所以

class MyResponse { 
    randomString 
    status 
    someOtherFieldRequired in response 
}  

,然后我可以做...

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

回答

1

你可以使用XmlAdapter连同XmlJavaTypeAdapter,但我认为它可能需要您将id和someRandomString属性封装到单独的类中。如果可能的话,直接将元素值传递给两个独立的bean属性并不是我所知道的。

+2

如果我增加了一个获得该做的结合,只绘制了吸气到XML输出的POJO? – user432024

+0

你需要一个getter和setter来允许编组和解组,但这实际上是个好主意。用一个从未使用过的相应字段(确保它被识别为一个bean属性)创建一些getter/setter对,并将逻辑放入它们中以填充两个实际目标字段,如一些诱饵和开关。这有点冒险,但它可以工作! –

1

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

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);