JAXB编辑List的getter方法?

9
我有一个数据模型,以XSD文件的形式存在,然后我使用命令行从中生成相应的Java文件。使用xjc从XSD生成JAXB类时,会为List类型元素生成getter方法(但没有对应的setter方法),如下所示:
public List<Type> getElement3() {
    if (element3 == null) {
        element3 = new ArrayList<Type>();
    }
    return this.element3;
}

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

应用场景:

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

然后,在进行编组时,我必须停止传递空列表以避免发送过多的空列表。

PS:我有一个使用案例,用户明确设置了空列表,服务器必须在后端删除某些项目。因此,区分值是由用户显式设置还是仅因访问字段时调用了List的getter而设置的很重要。

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

由于编辑编译后生成的java文件将是繁琐的,因为它存在于很多文件中,并且我们的XSD版本会得到更新,每次出现新版本时都必须进行编辑。

2个回答

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>());

Source of this example: Here


根据问题的规定,几乎每个类中都有List元素。因此,为每个类编写一个包装器将会很麻烦。 - Siddharth Trikha
3
看起来你可能需要一个自定义的XJC插件来生成你的代码。在 [这个][http://www.archive.ricston.com/blog/xjc-plugin/] 示例中,有人正在创建一个将Id字段设置为私有的插件(或其他内容)。在你的实现中,你应该检测何时使用了列表并避免进行空值检查和初始化。 - Victor
好的。链接已经失效了,需要从末尾移除多余的] - Siddharth Trikha
抱歉,我无法编辑评论。这里有其他的例子:https://blog.jooq.org/2018/02/19/how-to-implement-your-own-xjc-plugin-to-generate-tostring-equals-and-hashcode-methods/ 祝你好运 - Victor

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接