JAXB编辑列表获取器?

时间:2018-07-12 11:26:44

标签: java jaxb getter-setter moxy xjc

我拥有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版本正在更新,因此每次出现新版本时都必须执行编辑。

2 个答案:

答案 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