1
@XmlSeeAlso(Employee.class)
public abstract class Person {
     protected String name;

     public String getName() {
        return name;
     }

     public void setName(String name) {
         this.name = name;
     }
}

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Employee extends Person {
     private String name;

     public String getName() {
        return name;
     }

     public void setName(String name) {
         this.name = name;
     }
}

在我的公共静态 main() 中,我 setName("John") 并将其编组为 xml。

这会生成一个 XML:-

<Employee>
     <name>John</John>
</Employee>

但是,当我将其解组到 Employee 对象时,无论是超级类还是本地类都没有将它们的 name 变量初始化为“John”。我怀疑它为继承类和父类共享同名变量。我知道这是一种不好的做法,但是如何解组到 Employee 类?或两者?

感谢你。

4

1 回答 1

0

这个问题的答案从基本的 java 主体开始。由于派生类覆盖 setName 和 getName 。(new Employee()).setName("John") 填充员工的姓名而不是人员的姓名。因此,如果您想填充这两个类的属性,您应该将 person 类更改为

@XmlSeeAlso(Employee.class)
public abstract class Person {
     protected String firstName;

     public String getFirstName() {
    return firstName;
     }

     public void setFirstName(String firstName) {
     this.firstName = firstName;
     }
}

并做到这一点。

Employee e = new Employee();
e.setName("John");
e.setLastName("JohnLast");

然后你的 xml 看起来像

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<employee>
    <lastName>JohnLast</lastName>
    <name>John</name>
</employee>

和xsd

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="employee" type="employee"/>

  <xs:complexType name="employee">
    <xs:complexContent>
      <xs:extension base="person">
    <xs:sequence>
      <xs:element name="name" type="xs:string" minOccurs="0"/>
    </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="person" abstract="true">
    <xs:sequence>
      <xs:element name="lastName" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

并且在解组以下作品和名称和姓氏的过程中被填充,

JAXBContext context = JAXBContext.newInstance(Employee.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Employee e = (Employee) unmarshaller.unmarshal(xml);
Person p = (Person) unmarshaller.unmarshal(xml);
于 2013-10-20T23:47:58.383 回答