0

次のDTOは、サービスプロバイダーとサービスリクエスターの間で送信される一連の従業員レコードをカプセル化するためのものです。

@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);
}

このフィールドはemployeeではなくemployeeであるため、関数は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

employees プロパティで @XmlElement(name = "employee") を使用するだけです。

@XmlElementWrapper も参照してください。この場合は必要ありませんが (クラスは「従業員」ラッパーであるため)、「従業員」を持つ「会社」のようなものをモデル化する場合は必要になります。

于 2012-07-09T14:49:03.087 に答える