具有相同节点名称的 JAXB 继承解组

时间:2021-05-13 15:53:18

标签: jaxb

我有点迷茫。通读了几个类似的主题,但无法修复一个简单的例子。 问题:需要根据属性值使用不同的子类进行反序列化。 示例 xml:

<req act='some'>
  <a>s11</a>
  <b>s12</b>
</req>

<req act='other'>
  <a>21</a>
  <c>s22</c>
</req>

有人可以帮助并修复实体配置以进行测试吗?如果可能,不使用 MOXy impl

这是一些junit示例测试

class ExampleTest {

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlSeeAlso({SomeRequest.class, OtherRequest.class})
    @Getter @Setter
    static abstract class Request {
        @XmlAttribute private String act;
    }

    @Getter @Setter
    @XmlRootElement(name = "req")
    @XmlAccessorType(XmlAccessType.FIELD)
    static class SomeRequest extends Request {
        @XmlElement private String a;
        @XmlElement private String b;
    }

    @Getter
    @Setter
    @XmlRootElement(name = "req")
    @XmlAccessorType(XmlAccessType.FIELD)
    static class OtherRequest extends Request {
        @XmlElement private Integer a;
        @XmlElement private String c;
    }

    @Test
    void shouldUnmarshalSomeReq() throws Exception {
        String xml = "<req act='some'><a>s11</a><b>s12</b></req>";
        JAXBContext ctx = JAXBContext.newInstance(Request.class);
        var result = ctx.createUnmarshaller().unmarshal(new StringReader(xml));
        assertEquals(SomeRequest.class, result.getClass());
        assertEquals("s11", ((SomeRequest)result).a);
        assertEquals("s12", ((SomeRequest)result).b);
    }

    @Test
    void shouldUnmarshalOtherReq() throws Exception {
        String xml = "<req act='other'><a>21</a><c>s22</c></req>";
        JAXBContext ctx = JAXBContext.newInstance(Request.class);
        var result = ctx.createUnmarshaller().unmarshal(new StringReader(xml));
        assertEquals(OtherRequest.class, result.getClass());
        assertEquals(21, ((OtherRequest)result).a);
        assertEquals("s22", ((OtherRequest)result).c);
    }

}

0 个答案:

没有答案
相关问题