【问题标题】:When generating Java classes with JAXB, how can I add a custom field to each class?使用 JAXB 生成 Java 类时,如何为每个类添加自定义字段?
【发布时间】:2016-06-17 13:32:23
【问题描述】:

我正在使用 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 文件。

【问题讨论】:

    标签: java xml xsd jaxb


    【解决方案1】:

    这有点乱,但我可以用一个小的 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
    

    【讨论】:

      【解决方案2】:

      我不知道如何使用JAXB 创建自定义字段。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多