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之前测试这种情况。 看看这里的例子