java - jaxb 生成的类中的继承

标签 java xml jaxb

我正在使用 jaxb 自动生成类,用于将 xml 内容解码到 java 应用程序中。我注意到生成的类有很多冗余。特别是,它们最终将转移到的模型使用继承来避免冗余。我很想重写所有生成的类,以便它们也使用继承。有理由不这样做吗?

例如:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "A", propOrder = {"p1","p2","p3"})
Class A {
    @XmlElement(required = true)
    property p1;
    @XmlElement(required = true)
    property p2;
    @XmlElement(required = true)
    property p3;
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "B", propOrder = {"p1","p2","p4"})
class B {
    @XmlElement(required = true)
    property p1;
    @XmlElement(required = true)
    property p2;
    @XmlElement(required = true)
    property p4;
}

会变成:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Root", propOrder = {"p1","p2"})
@XmlSeeAlso({A.class, B.class})
Class Root {
    @XmlElement(required = true)
    property p1;
    @XmlElement(required = true)
    property p2;
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "A", propOrder = {"p3"})
Class A extends Root{
    @XmlElement(required = true)
    property p3;
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "B", propOrder = {"p4"})
Class B extends Root{
    @XmlElement(required = true)
    property p4;
}

如果我进行这种转换,@Xml... 注释会停止工作吗? jaxb 仍然能够正确解码吗?如果我不简化上面所示的代码,我认为替代方法是构建另一组中间类,将未编码的数据转换为我的应用程序的模型。有人愿意发表评论或改进吗?

最佳答案

简短回答

如果您进行此更改,JAXB 将继续工作。

你所做的事情的影响

如果您从 Java 类重新生成 XML 模式,您将看到复杂类型之间的继承。您可能希望将 Root 类抽象化,这样就不会有人意外地实例化它。

你还能做什么

您可以将Root 类标记为@XmlTransient。这会将其从类型层次结构中删除,并且其所有属性将被视为属于子类:

关于java - jaxb 生成的类中的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26002636/

相关文章:

java - 如何让 Apache Derby 和 Hibernate 在 Java EE 应用程序中打印英文异常消息?

java - Java 中的完整 LaTeX 解析器

java - 如何在Achartengine(Android)中分离主代码和图表代码

json - 将 XML 字符串转换为 JSON

java - 有没有什么工具可以验证@XmlPath注释?

java - 如何在 Intellij IDea 的测试中不删除静态导入?

java - 如何防止通过JAXB解析Html格式的数据

java - 如何将 XML 文件输出到 Java 中的 REST Web 服务,以便另一个应用程序可以使用此 XML?

java - 如何获取属性值?(javax.xml.bind.annotation)

java - JAXB - 如果类是同一类的字段,我们是否应该使用 @XmlSeeAlso 绑定(bind)类