使用JAXB生成Java类时,如何为每个类添加自定义字段?

时间:2016-06-17 13:32:23

标签: java xml xsd jaxb

我正在使用JAXB xjc命令行工具将XML架构(.xsd文件)转换为Java对象。

以下是我的.xsd文件的内容:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="ownerDog">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="owner" type="xs:string" />
            <xs:element name="dog" type="xs:string"/>
            <xs:element name="toy" type="toyType"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:complexType name="toyType">
    <xs:sequence>
        <xs:element name="color" type="xs:string" />
        <xs:element name="price" type="xs:integer" />
    </xs:sequence>
</xs:complexType>

</xs:schema>

当我运行.xsd时,我得到三个类:OwnerDog.java,ToyType.java和ObjectFactory.java。

我想向OwnerDog.java和ToyType.java添加自定义字段。该字段将引用一个簿记类,我将用它来跟踪XML树中每个节点的统计信息。

例如,这是我为ToyType.java获取的代码:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "toyType", propOrder = {
    "color",
    "price"
})
public class ToyType {

    @XmlElement(required = true)
    protected String color;
    @XmlElement(required = true)
    protected BigInteger price;

    public String getColor() {
        return color;
    }

    public void setColor(String value) {
        this.color = value;
    }

    public BigInteger getPrice() {
        return price;
    }

    public void setPrice(BigInteger value) {
        this.price = value;
    }

}

我希望它看起来像这样:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "toyType", propOrder = {
    "color",
    "price"
})
public class ToyType {

    private BookKeeper bk;

    @XmlElement(required = true)
    protected String color;
    @XmlElement(required = true)
    protected BigInteger price;

    public String getColor() {
        return color;
    }

    public void setColor(String value) {
        this.color = value;
    }

    public BigInteger getPrice() {
        return price;
    }

    public void setPrice(BigInteger value) {
        this.price = value;
    }

}

有没有办法以编程方式向JAXB生成的类添加字段?显然,对于我的例子来说,手动操作很容易,但这对于更大的生产问题来说只是一个实践问题。

我无法修改原始的.xsd文件,我需要将其用于多个我尚未见过的.xsd文件。

2 个答案:

答案 0 :(得分:0)

这有点乱,但我能用一个小的bash脚本完成这个:

xjc -p com.company.ustruc_to_xml OwnerDog.xsd
cd ./com/company/ustruc_to_xml
for f in *.java; do sed -i 's/\(^public class .*$\)/\1\n\n    private BookKeeper bk;/' $f; done
cp *.java /Users/car/Documents/workspace/proj_ustruc_to_xml/src/com/ibm/ustruc_to_xml

答案 1 :(得分:0)

我不知道使用JAXB创建自定义字段的方法。

我建议您尝试更改项目的结构。我创建了一个包含JAXB数据变量(ToyTypeOwnerDog)的类型,并保存BookKeeper。它可能是派生类型。

如果您的系统或开发团队变得更大,手动更改生成的JAXB代码会使事情变得更难。