3

是否可以使用 Java XML 绑定编译器 ( xjc )生成代码,该编译器使用空列表而不是 null 来实例化列表成员?

示例

XSD 文件 FooBar.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://foo.bar"
    targetNamespace="http://foo.bar" version="1.0">

    <xs:complexType name="FooBar">
        <xs:sequence>
            <xs:element name="entry" type="xs:string"
                maxOccurs="unbounded" minOccurs="0" />
        </xs:sequence>
    </xs:complexType>

</xs:schema>

使用此文件运行绑定编译器,例如

xjc FooBar.xsd

像这样生成 Java 源代码

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "FooBar", propOrder = {
    "entry"
})
public class FooBar {

    protected List<String> entry;

    public List<String> getEntry() {
        if (entry == null) {
            entry = new ArrayList<String>();
        }
        return this.entry;
    }

}

条目列表被实例化null并在 getter 方法中完成空值检查。但是我需要用这样的空列表来实例化 entry mamber:

 protected List<String> entry = new ArrayList<String>();

这在某种程度上可以通过定制来实现吗?我怎么没找到?

4

1 回答 1

4

嗯,Ben Thurley 的建议是一个很好的建议。但是,我一直在研究但尚未完全完成的另一种方法是创建一个插件。

我写了一个简短的教程,介绍如何创建一个允许您实例化字段的 XJC 插件。

添加以下行:

f.init(JExpr._new(co.parent().getCodeModel().ref(ArrayList.class)));

我能够生成以下代码:

@XmlElement(required = true)
protected List<Word> word = new ArrayList();

再一次,没有完成,但很有希望;)

更新:

run()方法中:替换下面的 if 语句

if (types.contains(f.type())){ 
    //If the type is defined in the schema
    //3. Instantiate
    f.init(JExpr._new(f.type())); 
}

使用以下 if 语句

if (f.type().boxify().getTypeParameters()!=null && 
    f.type().boxify().getTypeParameters().size()==1){
        // f.type() is a list
        JType inner = f.type().boxify().getTypeParameters().get(0);
    f.init(JExpr._new(co.parent().getCodeModel()
            .ref(ArrayList.class).narrow(inner)));
}

它会正确地实例化一个带有参数化的数组列表。

这里的 if 语句基本上是说,如果这种类型是参数化的,并且如果参数的数量正好是一个(两个意味着它的映射),假设它是一个列表并将其实例化为一个 ArrayList。该方法narrow()进行参数化。

更新 2

因为创建插件似乎需要做很多工作。我已经将我一直在开发的插件提交给GitHub。这个插件现在可以实例化字段、列表(到 ArrayLists),甚至可以将列表转换为 Set!

您现在需要做的就是获取插件。安装它mvn install。这会将其添加到您的 pom 文件中,如 GitHub 上的自述文件中所示。

我认为这是最接近“配置可能性”的方法。

玩得开心!

于 2013-09-04T11:19:54.540 回答