JAXB编辑列表getter?

Sid*_*kha 9 java jaxb xjc getter-setter moxy

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

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

public List<Type> getElement3() {
    if (element3 == null) {
        element3 = new ArrayList<Type>();
    }
    return this.element3;
}
Run Code Online (Sandbox Code Playgroud)

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

使用案例:

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

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

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

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

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

Vic*_*tor 3

首先,我会考虑使用自定义 JAXB 绑定,但我无法\xc2\xb4t 想到任何可以满足此要求的方法。

\n\n

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

\n\n
import java.util.List;\n\nimport javax.xml.bind.annotation.XmlAccessType;\nimport javax.xml.bind.annotation.XmlAccessorType;\nimport javax.xml.bind.annotation.XmlElement;\nimport javax.xml.bind.annotation.XmlRootElement;\n\n@XmlRootElement(name = "employees")\n@XmlAccessorType (XmlAccessType.FIELD)\npublic class Employees\n{\n    @XmlElement(name = "employee")\n    private List<Employee> employees = null;\n\n    public List<Employee> getEmployees() {\n        return employees;\n    }\n\n    public void setEmployees(List<Employee> employees) {\n        this.employees = employees;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后定义您的业务对象:

\n\n
@XmlRootElement(name = "employee")\n@XmlAccessorType (XmlAccessType.FIELD)\npublic class Employee\n{\n    private Integer id;\n    private String firstName;\n    private String lastName;\n    private double income;\n\n    //Getters and Setters\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
Employees employees = new Employees();\nemployees.setEmployees(new ArrayList<Employee>());\n
Run Code Online (Sandbox Code Playgroud)\n\n

这个例子的来源:这里

\n

  • 那么您似乎可能需要自定义 XJC 插件来生成代码。在[这个][http://www.archive.ricston.com/blog/xjc-plugin/]示例中,有人正在创建一个插件,将“Id”字段设置为私有(或其他)。在您的实现中,您应该检测何时使用列表并避免空检查+初始化。 (3认同)