我拥有XSD文件形式的数据模型,然后使用命令行从xjc
生成相应的Java文件。
当我从XSD生成JAXB类时,List
类型元素将为其生成一个getter方法(没有相应的setter方法),如下所示:
public List<Type> getElement3() {
if (element3 == null) {
element3 = new ArrayList<Type>();
}
return this.element3;
}
几乎所有从List
类型的XSD生成的文件中都有很多字段。
使用案例:
现在,我不希望通过null
检查生成吸气剂。我的应用程序代码具有经常调用每个字段的吸气剂的逻辑,这导致它们初始化为 empty List
。
然后在封送处理时,我必须停止将空列表传递到有效负载中,以避免通过网络发送大量空列表。
PS:我有一个用例,其中Empty List
由用户明确设置,服务器必须在后端删除某些项目。因此,区分值是由用户明确设置还是仅在访问该字段期间调用List
的吸气剂。
因此,如何使JAXB生成没有null
检查的吸气剂?
因此,编译后编辑生成的Java文件会很麻烦,因为其中包含很多文件,而且我们的XSD版本正在更新,因此每次出现新版本时都必须执行编辑。
答案 0 :(得分:3)
起初,我会考虑使用自定义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<Employee> employees = null;
public List<Employee> getEmployees() {
return employees;
}
public void setEmployees(List<Employee> 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<Employee>());
此示例的来源:Here
答案 1 :(得分:0)
我创建了一个小示例,您可以尝试。尽管它没有从原始的获取方法中删除空检查,但它是一个jaxb插件,它创建了一个附加方法isXXXNull
,并允许您在访问getXXX
方法之前测试此情况。看一下示例here