0

以下 DTO 用于封装要在服务提供者和服务请求者之间传输的一堆 Employee 记录。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement (name="employees")
public class EmployeeList {
  private List<Employee> employee;

  public List<Employee> getEmployee() {
    if (employee==null)
      employee = new ArrayList<Employee>();
    return employee;
  }

  public void setEmployee(List<Employee> employee) {
    this.employee = employee;
  }
}

上述 DTO 声明将生成以下 XML

<employees>
  <employee id="1234" ...... />
  <employee id="1236" ...... />
  ....
</employees>

当我希望获得员工名单时,问题就出现了。

public void showEmployees(EmployeeList employeeList) {
    List<Employee> employees = employeeList.getEmployee();
    dothedo(employees);
}

请注意,该函数不是 getEmployees 而是 getEmployee,因为该字段是雇员而不是雇员。

因此,我将 DTO 更改为:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement (name="employees")
public class EmployeeList {
  private List<Employee> employees;

  public List<Employee> getEmployees() {
    if (employee==null)
      employee = new ArrayList<Employee>();
    return employee;
  }

  public void setEmployee(List<Employee> employee) {
    this.employee = employee;
  }
}

所以我现在会得到员工

List<Employee> employees = employeeList.getEmployees();

将复数放入 DTO 的问题是会导致遵循 XML,这是不可接受的。我什至不认为 RestEasy 运行时不会因为根元素和子元素之间的命名冲突而发声。

<employees>
  <employees id="1234" ...... />
  <employees id="1236" ...... />
  ....
</employees>

那么,您的建议是什么,以使 DTO 在英语中直观(多个项目带有复数名称),并且 XML 输出也很直观(单数项目应该具有单数标签名称)。

有没有办法重新设计我的列表 DTO 来避免这种语义冲突?如果不是,您认为下一个版本的 jax-b 应该处理它是否足够重要?

4

1 回答 1

1

您只需要在您的员工财产上使用@XmlElement(name = "employee")。

另请参阅@XmlElementWrapper - 在这种情况下不是必需的(因为您的类是“员工”包装器),但如果您使用“员工”对“公司”之类的东西进行建模,则这是必需的。

于 2012-07-09T14:49:03.087 回答