我正在使用 JAXB 来读取和写入 XML。我想要的是使用基本 JAXB 类进行编组,并使用继承的 JAXB 类进行解组。这是为了允许发送方 Java 应用程序将 XML 发送到另一个接收方 Java 应用程序。发送者和接收者将共享一个公共的 JAXB 库。我希望接收方将 XML 解组到接收方特定的 JAXB 类中,该类扩展了通用 JAXB 类。
Example:
这是发送者使用的公共 JAXB 类。
@XmlRootElement(name="person")
public class Person {
public String name;
public int age;
}
这是解组 XML 时使用的接收器特定的 JAXB 类。接收器类具有特定于接收器应用程序的逻辑。
@XmlRootElement(name="person")
public class ReceiverPerson extends Person {
public doReceiverSpecificStuff() ...
}
编组按预期工作。问题出在解组上,它仍然解组到Person
尽管 JAXBContext 使用子类的包名称ReceiverPerson
.
JAXBContext jaxbContext = JAXBContext.newInstance(package name of ReceiverPerson);
我想要的是解组到ReceiverPerson
。我能够做到这一点的唯一方法是删除@XmlRootElement
from Person
。不幸的是这样做可以防止Person
免遭编组。就好像 JAXB 从基类开始并向下工作,直到找到第一个@XmlRootElement
具有适当的名称。我试过添加一个createPerson()
返回的方法ReceiverPerson
to ObjectFactory
但这没有帮助。
以下代码片段是 Junit 4 测试的方法并获得批准:
@Test
public void testUnmarshallFromParentToChild() throws JAXBException {
Person person = new Person();
int age = 30;
String name = "Foo";
person.name = name;
person.age= age;
// Marshalling
JAXBContext context = JAXBContext.newInstance(person.getClass());
Marshaller marshaller = context.createMarshaller();
StringWriter writer = new StringWriter();
marshaller.marshal(person, writer);
String outString = writer.toString();
assertTrue(outString.contains("</person"));
// Unmarshalling
context = JAXBContext.newInstance(Person.class, RecieverPerson.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
StringReader reader = new StringReader(outString);
RecieverPerson reciever = (RecieverPerson)unmarshaller.unmarshal(reader);
assertEquals(name, reciever.name);
assertEquals(age, reciever.age);
}
重要的部分是使用JAXBContext.newInstance(Class... classesToBeBound)
解组上下文的方法:
context = JAXBContext.newInstance(Person.class, RecieverPerson.class);
通过此调用,JAXB 将计算指定类的引用闭包并识别RecieverPerson
。测试通过。如果你改变参数顺序,你会得到一个java.lang.ClassCastException
(所以他们must按此顺序通过)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)