我有点迷茫。通读了几个类似的主题,但无法修复一个简单的例子。 问题:需要根据属性值使用不同的子类进行反序列化。 示例 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);
}
}