JAXB编辑列表getter?

我有XSD文件forms的数据模型,然后使用命令行从xjc生成相应的Java文件。

当我从XSD生成JAXB类时, List类型元素获取为它们生成的getter方法(没有相应的setter方法),如下所示:

 public List getElement3() { if (element3 == null) { element3 = new ArrayList(); } return this.element3; } 

我在从List类型的XSD生成的几乎每个文件中都有很多字段。

使用案例:

现在,我不希望使用null检查生成getter。 我的应用程序代码具有逻辑,其中每个字段的getter经常被调用,这导致它们初始化为 List

然后在编组时我必须停止空列表以传递有效负载,以避免通过线路发送大量空列表。

PS:我有一个用户明确设置Empty List的用例,服务器必须删除后端的某些项目。 因此,区分值是由用户显式设置还是仅因为在访问字段期间调用List的getter而设置。

那么,如何让JAXB生成一个没有null检查的getter?

因为在编译之后编辑生成的java文件会很麻烦,因为它存在于很多文件中,我们有XSD版本需要更新,每次新版本出现时都必须执行编辑。

首先,我会考虑使用自定义JAXB绑定,但我不会想到任何符合此要求的内容。

在这种情况下,也许您可​​以使用包装类:

 import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "employees") @XmlAccessorType (XmlAccessType.FIELD) public class Employees { @XmlElement(name = "employee") private List employees = null; public List getEmployees() { return employees; } public void setEmployees(List employees) { this.employees = employees; } } 

然后定义您的业务对象:

 @XmlRootElement(name = "employee") @XmlAccessorType (XmlAccessType.FIELD) public class Employee { private Integer id; private String firstName; private String lastName; private double income; //Getters and Setters } 

在生成要编组的对象时,您必须自己控制列表的初始化:

 Employees employees = new Employees(); employees.setEmployees(new ArrayList()); 

这个例子的来源: 这里

我创建了一个你可以尝试的小例子。 虽然它不会从原始getter中删除null-check,但它是一个jaxb-plugin,它创建了一个额外的方法isXXXNull并允许您在访问getXXX -method之前测试这种情况。 看看这里的例子