【问题标题】:Good JAXB design pattern to wrap model and or convert model (POJO)?包装模型和/或转换模型(POJO)的良好 JAXB 设计模式?
【发布时间】:2011-10-25 21:21:52
【问题描述】:

我有以下型号

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>

所以 root 和用户名和密码是常量元素,而 SomeModel 可以根据“服务”改变

基本上,我正在寻找一种设计模式,其中 XML 与模型不匹配,并且需要相互转换......

如果我这样做了会怎样……

class MyClass {
    id
    someRandomString
    random

    @XMLTransient
    getId()


    @XMLTransient
    getSomeRandomString()


    getRandom() {
        return id + someRandomString
    }
}

所以 JAXB 只会映射 getRandom...

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

所以

class MyResponse {
    randomString
    status
    someOtherFieldRequired in response
}    

然后我可以做...

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

【问题讨论】:

    标签: design-patterns jaxb


    【解决方案1】:

    您可以将XmlAdapterXmlJavaTypeAdapter 结合使用,但我认为这可能需要您将 id 和 someRandomString 属性封装到一个单独的类中。如果可能的话,我不知道如何将一个元素值直接分布在两个单独的 bean 属性上。

    【讨论】:

    • 如果我添加一个 get 到执行组合的 pojo 并且只将该 getter 映射到 XML 输出?
    • 你需要一个 getter 和 setter 来允许编组和解组,但这实际上是一个非常好的主意。使用从未使用过的相应字段制作一些 getter/setter 对(以确保它被识别为 bean 属性),并将逻辑放入其中以填充两个实际目标字段,例如一些诱饵和切换。这有点 hacky,但它可以工作!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-12-22
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      相关资源
      最近更新 更多