我为jaxb问题寻找解决方案的最后几天,但它没有成功......所以我希望也许有人可以帮助我。
base是来自外部伙伴的xsd架构,它是原样的,即我无法更改它。使用xjc生成的类没有问题,但枚举不是“java兼容”。 某些值是nummeric或alphanumeric,因此必须在绑定中设置属性typesafeEnumMemberName =“generateName”。
Jaxb然后生成枚举键,如VALUE_1,VALUE_2等。我现在的问题是,有些枚举有< 250个条目,只有条目的javadoc表示有关该值的信息。 这不是很舒服并且可以强制错误,因为以下MandatType枚举的值VALUE_1具有值“E”而不是“1”.... XSD:
<xsd:simpleType name="MandatType">
<xsd:annotation>
<xsd:documentation/>
</xsd:annotation>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="1"/>
<xsd:minLength value="1"/>
<xsd:enumeration value="E">
<xsd:annotation>
<xsd:documentation>Erinnerung</xsd:documentation>
</xsd:annotation>
</xsd:enumeration>
<xsd:enumeration value="1">
<xsd:annotation>
<xsd:documentation>Klage</xsd:documentation>
</xsd:annotation>
</xsd:enumeration>
<xsd:enumeration value="2">
<xsd:annotation>
<xsd:documentation>Beschaffung</xsd:documentation>
</xsd:annotation>
</xsd:enumeration>
<xsd:enumeration value="Z">
<xsd:annotation>
<xsd:documentation>Storno</xsd:documentation>
</xsd:annotation>
</xsd:enumeration>
</xsd:restriction>
</xsd:simpleType>
类:
@XmlType(name = "MandatType")
@XmlEnum
public enum MandatType {
/**
* Erinnerung
*
*/
@XmlEnumValue("E")
VALUE_1("E"),
/**
* Klage
*
*/
@XmlEnumValue("1")
VALUE_2("1"),
/**
* Beschaffung
*
*/
@XmlEnumValue("2")
VALUE_3("2"),
/**
* Storno
*
*/
@XmlEnumValue("Z")
VALUE_Z("Z"),
//...
}
我找到的唯一解决方案是为绑定中的每个枚举值定义枚举键。但问题是,大约有14.000个值! 那么还有其他人可以解决这个问题吗?当xjc生成类时,是否可以定义覆盖/更改枚举值的方法?或者使用枚举键的xsd:documentation值?
非常感谢提前 斯蒂芬
答案 0 :(得分:1)
可以编写自己的JAXB插件,然后可以使用它来合并任意数据以修改生成的代码。这个link有一些指针可供您查阅以获取更多信息。
或者,您可以考虑更简单的事情(在我看来),那就是将您的XSD重构为可以使用开箱即用功能的东西。
如果你想要的只是沿着这些方向,那么转换它:
<xsd:enumeration value="E">
<xsd:annotation>
<xsd:documentation>Erinnerung</xsd:documentation>
</xsd:annotation>
</xsd:enumeration>
进入这个:
<xsd:enumeration value="E">
<xsd:annotation>
<xsd:documentation>Erinnerung</xsd:documentation>
<xsd:appinfo>
<jaxb:typesafeEnumMember name="Erinnerung"/>
</xsd:appinfo>
</xsd:annotation>
</xsd:enumeration>
然后我认为基本的XSLT技能应该对此有所帮助,比编写JAXB插件或使用XSOM等更好,其中14000左右不应该有所作为。即使您的架构分布在数百个文件上,对于一次执行一个架构的愚蠢XSLT,然后只是为每个文件生成命令行,仍然会更容易......
这是一个简单的XSLT:
<xsl:stylesheet version="1.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="xsd:enumeration">
<xsd:enumeration>
<xsl:attribute name="value">
<xsl:value-of select="@value"/>
</xsl:attribute>
<xsd:annotation>
<xsl:copy-of select="xsd:annotation/xsd:documentation"/>
<xsd:appinfo>
<jaxb:typesafeEnumMember>
<xsl:attribute name="name">
<xsl:value-of select="xsd:annotation/xsd:documentation"/>
</xsl:attribute>
</jaxb:typesafeEnumMember>
</xsd:appinfo>
</xsd:annotation>
</xsd:enumeration>
</xsl:template>
</xsl:stylesheet>
可以替换简单的文档&#34; dump&#34;使用模板调用,可以处理文本,或提供替代方案,或为特定条件发出消息等。
生成的输出可能如下所示:
<?xml version="1.0" encoding="utf-16"?>
<xsd:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:xtm="http://paschidev.com/schemas/metadata/xtm">
<xsd:simpleType name="MandatType">
<xsd:annotation>
<xsd:documentation/>
</xsd:annotation>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="1"/>
<xsd:minLength value="1"/>
<xsd:enumeration value="E">
<xsd:annotation>
<xsd:documentation>Erinnerung</xsd:documentation>
<xsd:appinfo>
<jaxb:typesafeEnumMember name="Erinnerung"/>
</xsd:appinfo>
</xsd:annotation>
</xsd:enumeration>
<xsd:enumeration value="1">
<xsd:annotation>
<xsd:documentation>Klage</xsd:documentation>
<xsd:appinfo>
<jaxb:typesafeEnumMember name="Klage"/>
</xsd:appinfo>
</xsd:annotation>
</xsd:enumeration>
<xsd:enumeration value="2">
<xsd:annotation>
<xsd:documentation>Beschaffung</xsd:documentation>
<xsd:appinfo>
<jaxb:typesafeEnumMember name="Beschaffung"/>
</xsd:appinfo>
</xsd:annotation>
</xsd:enumeration>
<xsd:enumeration value="Z">
<xsd:annotation>
<xsd:documentation>Storno</xsd:documentation>
<xsd:appinfo>
<jaxb:typesafeEnumMember name="Storno"/>
</xsd:appinfo>
</xsd:annotation>
</xsd:enumeration>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>