当前位置: 首页 > 知识库问答 >
问题:

无法使用JAXB生成枚举类

毛越
2023-03-14

使用JAXB从XSD(作为标准分发,我无法控制,也无法更改)生成一些POJO有很多困难。问题似乎与XSD中定义某些类型的方式有关。下面我粘贴了一个在XSD中定义的名为TransactionCodeType的简单类型,它是一个令牌与值的枚举列表(也定义为令牌)的联合。

<xs:element name="TransactionContentDetails">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="TransactionIdentifier" type="xs:string" minOccurs="0"/>
            <xs:element name="TransactionCode" type="TransactionCodeType"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:simpleType name="TransactionCodeType">
    <xs:union memberTypes="xs:token">
        <xs:simpleType>
            <xs:restriction base="xs:token">
                xs:enumeration value="Design E-Filing"/>
                <xs:enumeration value="Design B2B-Filing" />
                <xs:enumeration value="Design Information" />
                <xs:enumeration value="Design Identifier List" />
                <xs:enumeration value="Design List" />
                <xs:enumeration value="Design Opposition E-Filing" />
                <xs:enumeration value="Design Opposition Information" />
                <xs:enumeration value="Design Opposition Identifier List" />
                <xs:enumeration value="Representative Appointment" />
                <xs:enumeration value="Amendment Registered Design" />
                <xs:enumeration value="Amendment Application" />
                <xs:enumeration value="Convention Application" />
                <xs:enumeration value="Additional Application" />
                <xs:enumeration value="Subsequent Application" />
                <xs:enumeration value="Divisional Application" />
                <xs:enumeration value="Assignment Application" />
                <xs:enumeration value="Assignment Registered Design" />
                <xs:enumeration value="Request Certified Copies" />
                <xs:enumeration value="Request Extension Time" />
                <xs:enumeration value="Request Hearing" />
                <xs:enumeration value="Opposition First Extension" />
                <xs:enumeration value="Opposition Various Renewal/Extension of Registration Restoration" />
                <xs:enumeration value="Withdrawal" />
                <xs:enumeration value="Withdraw Application" />
                <xs:enumeration value="Withdraw Design" />
                <xs:enumeration value="Response Examination Report" />
                <xs:enumeration value="Statement Support" />
                <xs:enumeration value="Withdraw Service Request" />
                <xs:enumeration value="Request Publication" />
                <xs:enumeration value="Request Registration" />
                <xs:enumeration value="Offer Surrender" />
                <xs:enumeration value="Request Exclusion" />
                <xs:enumeration value="Request Conversion" />
                <xs:enumeration value="Duplicate Certificate" />
                <xs:enumeration value="Request Supply Documents" />
                <xs:enumeration value="Request Delayed Registration" />
                <xs:enumeration value="Request Accelerated Examination" />
                <xs:enumeration value="Expiry Notice" />
                <xs:enumeration value="Refusal Withdrawal Notification" />
                <xs:enumeration value="Division International Registration Notification" />
                <xs:enumeration value="Refusal Notification" />
                <xs:enumeration value="Providing Certificate To Holder" />
                <xs:enumeration value="Transmittal Application To IB" />
                <xs:enumeration value="Irregularities" />
                <xs:enumeration value="Invalidation Notification" />
                <xs:enumeration value="Cancellation Representative Appointment" />
                <xs:enumeration value="Application Receipt" />
                <xs:enumeration value="Notice Document By Design Formality Examination" />
                <xs:enumeration value="Notice Document By Design Substantial Examination" />
                <xs:enumeration value="Notice Document By Design Registration" />
                <xs:enumeration value="Notice Document By Trial Examination - Invitation" />
                <xs:enumeration value="Notice Document By Trial Examination" />
                <xs:enumeration value="Notice Document By Trial Examination - Decision" />
                <xs:enumeration value="Memo By Design Formality Examination" />
                <xs:enumeration value="Memo By Design Substantial Examination" />
                <xs:enumeration value="Memo By Trial Examination" />
                <xs:enumeration value="Memo By Trial Notice" />
                <xs:enumeration value="Memo By Trial Examination - Correction" />
                <xs:enumeration value="Accept Design Application Document" />
                <xs:enumeration value="Accept Design Applicant Document" />
                <xs:enumeration value="Accept Design Attorney Document" />
                <xs:enumeration value="Accept Design Withdrawal And Abandonment Document" />
                <xs:enumeration value="Accept Design Response Document" />
                <xs:enumeration value="Accept Design Submission Document" />
                <xs:enumeration value="Accept Design Amendment Document" />
                <xs:enumeration value="Accept Design Request For Inspection" />
                <xs:enumeration value="Accept Demand For A Trial" />
                <xs:enumeration value="Accept Trial Intermediate Document" />
                <xs:enumeration value="Inspection Accept Design Application Document" />
                <xs:enumeration value="Inspection Accept Design Applicant Document" />
                <xs:enumeration value="Inspection Accept Design Attorney Document" />
                <xs:enumeration value="Inspection Accept Design Withdrawal And Abandonment Document" />
                <xs:enumeration value="Inspection Accept Design Response Document" />
                <xs:enumeration value="Inspection Accept Design Submission Document" />
                <xs:enumeration value="Inspection Accept Design Amendment Document" />
                <xs:enumeration value="Inspection Accept Design Request For Inspection" />
                <xs:enumeration value="Inspection Accept Demand For A Trial" />
                <xs:enumeration value="Inspection Accept Trial Intermediate Document" />
                <xs:enumeration value="Inspection Notice Document By Design Formality Examination" />
                <xs:enumeration value="Inspection Notice Document By Design Substantial Examination" />
                <xs:enumeration value="Inspection Notice Document By Design Registration" />
                <xs:enumeration value="Inspection Notice Document By Trial Examination - Invitation" />
                <xs:enumeration value="Inspection Notice Document By Trial Examination" />
                <xs:enumeration value="Inspection Notice Document By Trial Examination - Decision" />
                <xs:enumeration value="Inspection Memo By Design Formality Examination" />
                <xs:enumeration value="Inspection Memo By Design Substantial Examination" />
                <xs:enumeration value="Inspection Memo By Trial Examination" />
                <xs:enumeration value="Inspection Memo By Trial Notice" />
                <xs:enumeration value="Certified Copy Notice Document By Design Formality Examination" />
                <xs:enumeration value="Certified Copy Notice Document By Design Substantial Examination" />
                <xs:enumeration value="Certified Copy Notice Document By Design Registration" />
                <xs:enumeration value="Certified Copy Notice Document By Trial Examination - Invitation" />
                <xs:enumeration value="Certified Copy Notice Document By Trial Examination" />
                <xs:enumeration value="Certified Copy Notice Document By Trial Examination - Decision" />
                <xs:enumeration value="Accept Document List" />
                <xs:enumeration value="Notice Document List" />
                <xs:enumeration value="Application Information" />
                <xs:enumeration value="Balance Sheet Reference" />
                <xs:enumeration value="Division Number List" />
                <xs:enumeration value="Record Licence" />
                <xs:enumeration value="Record Mortgagee" />
                <xs:enumeration value="Terminate Licence" />
                <xs:enumeration value="Discharge Mortgagee" />
                <xs:enumeration value="Change of Name" />
            </xs:restriction>
        </xs:simpleType>
    </xs:union>
</xs:simpleType>

使用JAXB,生成的输出(见下文)被翻译为Java中的基本类型字符串。我使用的是来自org的最新版本的maven-jaxb2-plugin。jvnet。jaxb2。maven2。在某种程度上,这正是我所期待的。因此,我希望能够从Java代码中访问XSD中定义的可能值列表。但是怎么做呢?JAXB没有生成定义所有这些值的枚举类。我已经在网上搜索过,包括在这个网站下,以寻找解决方案;尝试一些建议的解决方案,包括使用绑定,但没有成功。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "transactionIdentifier",
    "transactionCode",
})
public static class TransactionContentDetails implements Serializable  {

    @XmlElement(name = "TransactionIdentifier")
    protected String transactionIdentifier;
    @XmlElement(name = "TransactionCode", required = true)
    protected String transactionCode;

    public String getTransactionIdentifier() {
        return transactionIdentifier;
    }

    public void setTransactionIdentifier(String value) {
        this.transactionIdentifier = value;
    }

    public String getTransactionCode() {
        return transactionCode;
    }

    public void setTransactionCode(String value) {
        this.transactionCode = value;
    }
}

所以,我想看看你对如何解决这个问题有什么想法,也就是说,能够生成一个包含所有这些值的Java枚举类。作为解决方案的一部分,我不想在绑定文件中重新定义所有这些值。

谢谢!

共有3个答案

萧焱
2023-03-14

xsd限制不是enum,如果使用enum,封送将出现问题。您可以向jaxb代码生成器添加自定义行为,并在setTransactionCode方法上添加验证。

看看这篇文章https://jaxb.java.net/guide/Adding_behaviors.html

越扬
2023-03-14

看起来工会没有得到很好的支持https://jaxb.java.net/tutorial/section_2_2_10-Defining-a-Type-Union.html

如果您可以修改模式,您可以将枚举的匿名简单类型提取为命名类型,然后在代码中使用为该新类型生成的Java枚举。

仲孙宇定
2023-03-14

您可以更改您的架构以添加名称,然后生成名称“设计Enum”的pojo。

  <xsd:simpleType name="designEnum">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="Design1"/>
            <xsd:enumeration value="Design2"/>
        </xsd:restriction>
    </xsd:simpleType>

枚举

import javax.xml.bind.annotation.*;
@XmlType(name = "designEnum")
@XmlEnum
public enum DesignEnum {

    Design1,
    Design1;

    public String value() {
        return name();
    }

    public static DesignEnum fromValue(String v) {
        return valueOf(v);
    }

}
 类似资料:
  • 问题内容: 假设我有一个格式为基本XML的文件,如下所示: 我想在运行时变成这样的东西: …,然后将新创建的枚举传递给我的应用程序。我将如何实现这样的目标?可以吗 问题答案: 您尝试做的事情没有任何意义。枚举实际上仅是为了编译时的利益,因为它们表示一组固定的常量。在运行时,动态生成的枚举的含义是什么- 与普通对象有什么不同?例如: 您的XML可以解析为新实例化的对象,这些对象可以存储在某些程序中,

  • 我试图让Maven使用嵌套的xml模式生成JAXB绑定:模式a导入模式B。模式B导入模式C。 如果模式A中的对象引用了模式B中不依赖于模式C对象的对象,那么一切都构建得很好。如果模式B中的对象引用了模式C中的对象,它就会中断。也就是说,深入一层是可行的。去两个深度没有。 只要我在模式A中添加一个引用模式B中对象的对象,而模式B又引用了模式C中的对象,我就会得到一个组织。xml。萨克斯。SAXPar

  • 当我们需要定义常量时,一个办法是用大写变量通过整数来定义,例如月份: JAN = 1 FEB = 2 MAR = 3 ... NOV = 11 DEC = 12 好处是简单,缺点是类型是int,并且仍然是变量。 更好的方法是为这样的枚举类型定义一个class类型,然后,每个常量都是class的一个唯一实例。Python提供了Enum类来实现这个功能: from enum import Enum

  • 我在BE端有属性,我可以通过处理程序获取和设置。我使用枚举来设置属性,并使用bean类来获取。现在我需要重复属性名称,我想避免它。 现在我必须支持这些类之间的两种方式的一致性。

  • 几个小时以来,我一直在努力让MapStruct为JAXB生成的类生成有效的映射器。这些类的特殊性在于,它们既没有集合的setter,也没有集合的adder。例如: 类avove有一个getter和一个属性设置器(本例中为firstName),但对于集合(此处列出),它只有一个getter。因此,消费者有责任通过getAddressTypes(add(new AddressType(...))进行访

  • 问题:给定一个整数数组,返回两个数字的索引,使它们相加到一个特定的目标。 您可以假设每个输入都有一个精确的解决方案,并且您可以不使用相同的元素两次。 例子: 给定nums=[2,7,11,15],target=9, 因为Nums[0]Nums[1]=2 7=9,返回[0,1]。 使用for循环后,我无法理解这些步骤。我是Python新手,请有人帮助我。