JAXB - 控制包装类

时间:2018-02-14 14:32:36

标签: java jaxb

我有一个包装列表和一些其他属性的类,而在另一个类中我有多个包装类型的实例。我知道我们可以通过将XmlElement注释添加到我们需要的任何元素来控制元素的名称。有没有办法从包装器类型的任何地方指定与包装器类型的内容相对应的元素名称?

例如,包装类看起来像

@XmlAccessorType(XmlAccessType.FIELD)
public class Wrapper {

  @XmlElement(name = "name")
  private List<String> names;
  private String comment;

  //Getters and setters

}

包装器用作

private Wrapper employeeNames;
private Wrapper departmentNames;
private Wrapper someOtherNames;

我可以在某种程度上注释这些字段,以便我将XML形成为

<employeeNames>
  <employeeName>ABC DEF</employeeName>
  <employeeName>PQR STU</employeeName>
  <employeeName>ABC</employeeName>
</employeeNames>
<departmentNames>
  <departmentName>PQR</departmentName>
  <departmentName>PQR STU</departmentName>
  <departmentName>MNO</departmentName>
</departmentNames>

我知道如果没有包装器并直接使用列表,我可以使用@XmlElementWrapper@XmlElement注释来构建这样的XML。

2 个答案:

答案 0 :(得分:2)

你可以试试这个:

@XmlAccessorType(XmlAccessType.FIELD)
public class Wrapper {
    @XmlElements({
            @XmlElement(name = "employeeName", type = EmployeeName.class),
            @XmlElement(name = "departmentName", type = DepartmentName.class),
    })
    private List<Name> names;
    private String comment;

    public void setNames(List<Name> names) {
        this.names = names;
    }
}

然后是EmployeeName和DepartmentName,如下所示:

@XmlAccessorType(XmlAccessType.FIELD)
public class EmployeeName implements Name {
    @XmlValue
    private String name;

    public EmployeeName(String name) {
        this.name = name;
    }
}

他们都实现了一个不做太多的界面:

public interface Name {  }

我在您的包装器中将List<String>更改为List<Name>,因为如果它们都是String类型,那么编组就会有区分employeeName和departmentName的问题。

答案 1 :(得分:1)

唯一想到的是,您可以使用@XmlElement代替@XmlElementRef

@XmlElementRef(name = "name")
private List<JAXBElement<String>> names;

然后,您可以在names的每个元素中指定所需的元素名称:

wrapper.names.add(new QName("departmentName"), String.class, "PQR");