从您发布的日志消息中,我可以看到您正在使用MOXy的外部映射文档(请参阅http://blog.bdoughan.com/2010/12/extending-
jaxb-representing-
annotations.html)。有两种不同的方式来映射继承的属性。
选项#1-映射属于父级的继承属性
默认情况下,字段/属性需要映射到它所属的类中。由于MOXy在包级别限制了外部映射文档,因此您将需要为
A和单独的映射文档
B。
Forum10874711 / a / binding1.xml
<?xml version="1.0"?><xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" package-name="forum10874711.a"> <java-types> <java-type name="A"> <java-attributes> <xml-element java-attribute="fieldOfClassA" name="field-of-class-a"/> </java-attributes> </java-type> </java-types></xml-bindings>
Forum10874711 / b / binding1.xml
<?xml version="1.0"?><xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" package-name="forum10874711.b"> <java-types> <java-type name="B"> <xml-root-element/> <java-attributes> <xml-element java-attribute="fieldOfClassB" name="field-of-class-b"/> </java-attributes> </java-type> </java-types></xml-bindings>
Forum10874711 / b / jaxb.properties
要将MOXy指定为JAXB实现,您需要
jaxb.properties使用以下条目添加一个与域模型相同的包中调用的文件。
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
演示版
package forum10874711;import java.util.*;import javax.xml.bind.*;import org.eclipse.persistence.jaxb.JAXBContextFactory;import forum10874711.b.B;public class Demo1 { public static void main(String[] args) throws Exception { Map<String, Object> properties = new HashMap<String, Object>(1); List<String> metadata = new ArrayList<String>(2); metadata.add("forum10874711/a/binding1.xml"); metadata.add("forum10874711/b/binding1.xml"); properties.put(JAXBContextFactory.ECLIPSElink_OXM_XML_KEY, metadata); JAXBContext jc = JAXBContext.newInstance(new Class[] {B.class}, properties); B b = new B(); b.setFieldOfClassA("foo"); b.setFieldOfClassB(123); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.marshal(b, System.out); }}输出量
<?xml version="1.0" encoding="UTF-8"?><b> <field-of-class-a>foo</field-of-class-a> <field-of-class-b>123</field-of-class-b></b>
选项#2-映射属于子级的继承属性
父类
A' can be marked@XmlTransient
this will allow us to map the inheritedfields/properties on the childclassB`(请参阅http://blog.bdoughan.com/2011/06/ignoring-inheritance-with-
xmltransient.html)。
Forum10874711 / a / binding2.xml
<?xml version="1.0"?><xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" package-name="forum10874711.a"> <java-types> <java-type name="A" xml-transient="true"/> </java-types></xml-bindings>
Forum10874711 / b / binding2.xml
<?xml version="1.0" encoding="UTF-8"?><xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" package-name="forum10874711.b"> <java-types> <java-type name="B"> <xml-root-element/> <java-attributes> <xml-element java-attribute="fieldOfClassA" name="field-of-class-a"/> <xml-element java-attribute="fieldOfClassB" name="field-of-class-b"/> </java-attributes> </java-type> </java-types></xml-bindings>
演示版
package forum10874711;import java.util.*;import javax.xml.bind.*;import org.eclipse.persistence.jaxb.JAXBContextFactory;import forum10874711.b.B;public class Demo2 { public static void main(String[] args) throws Exception { Map<String, Object> properties = new HashMap<String, Object>(1); List<String> metadata = new ArrayList<String>(2); metadata.add("forum10874711/a/binding2.xml"); metadata.add("forum10874711/b/binding2.xml"); properties.put(JAXBContextFactory.ECLIPSElink_OXM_XML_KEY, metadata); JAXBContext jc = JAXBContext.newInstance(new Class[] {B.class}, properties); B b = new B(); b.setFieldOfClassA("foo"); b.setFieldOfClassB(123); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.marshal(b, System.out); }}输出量
<?xml version="1.0" encoding="UTF-8"?><b> <field-of-class-a>foo</field-of-class-a> <field-of-class-b>123</field-of-class-b></b>



