【问题标题】:Semantics/grammar conflict between English and JAX-B英语和 JAX-B 之间的语义/语法冲突
【发布时间】:2012-07-09 14:41:42
【问题描述】:

下面的 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,因为字段是employee而不是employees。

所以,我将 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 应该处理它是否足够重要?

【问题讨论】:

    标签: java rest jaxb jax-rs resteasy


    【解决方案1】:

    您只需要在您的雇员属性上使用@XmlElement(name = "employee")。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-02
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多