Jaxb 在动态moxy中的枚举中发现ClassNotFound异常

Jaxb 在动态moxy中的枚举中发现ClassNotFound异常,jaxb,xsd,eclipselink,classnotfoundexception,moxy,Jaxb,Xsd,Eclipselink,Classnotfoundexception,Moxy,我正在为jaxb使用EclipseLink dynamic moxy。当我尝试设置枚举值时,我得到一个ClassNotFound异常。有人能指出我做错了什么吗 <xs:element name="customer" type="customerType"> </xs:element> <xs:complexType name="customerType"> <xs:sequence> <xs:element nam

我正在为jaxb使用EclipseLink dynamic moxy。当我尝试设置枚举值时,我得到一个ClassNotFound异常。有人能指出我做错了什么吗

<xs:element name="customer" type="customerType"> </xs:element>

 <xs:complexType name="customerType">
    <xs:sequence>
        <xs:element name="number" type="numberEnum"/>
        <xs:element name="name" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

<xs:simpleType name="numberEnum">
    <xs:restriction base="xs:string">
        <xs:enumeration value="1"/>
        <xs:enumeration value="2"/>
        <xs:enumeration value="3"/>
    </xs:restriction>
</xs:simpleType>
模式:

<xs:element name="customer" type="customerType"> </xs:element>

 <xs:complexType name="customerType">
    <xs:sequence>
        <xs:element name="number" type="numberEnum"/>
        <xs:element name="name" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

<xs:simpleType name="numberEnum">
    <xs:restriction base="xs:string">
        <xs:enumeration value="1"/>
        <xs:enumeration value="2"/>
        <xs:enumeration value="3"/>
    </xs:restriction>
</xs:simpleType>
使用createContextFromXSD()创建上下文时是否出错?我举了一个例子:

<xs:element name="customer" type="customerType"> </xs:element>

 <xs:complexType name="customerType">
    <xs:sequence>
        <xs:element name="number" type="numberEnum"/>
        <xs:element name="name" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

<xs:simpleType name="numberEnum">
    <xs:restriction base="xs:string">
        <xs:enumeration value="1"/>
        <xs:enumeration value="2"/>
        <xs:enumeration value="3"/>
    </xs:restriction>
</xs:simpleType>
我在访问其他JAXB生成的类时没有问题。该问题仅适用于枚举类。它们是否与其他生成的类或其他东西放在不同的包中

<xs:element name="customer" type="customerType"> </xs:element>

 <xs:complexType name="customerType">
    <xs:sequence>
        <xs:element name="number" type="numberEnum"/>
        <xs:element name="name" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

<xs:simpleType name="numberEnum">
    <xs:restriction base="xs:string">
        <xs:enumeration value="1"/>
        <xs:enumeration value="2"/>
        <xs:enumeration value="3"/>
    </xs:restriction>
</xs:simpleType>
编辑:在主程序中,我收到一个xml模式文件作为输入。我使用xsom解析器来检索元素和类型声明,然后使用JAXB生成的类进行封送,以获得输出,即XML文件。因此,我需要对模式进行的任何更改都必须动态进行

<xs:element name="customer" type="customerType"> </xs:element>

 <xs:complexType name="customerType">
    <xs:sequence>
        <xs:element name="number" type="numberEnum"/>
        <xs:element name="name" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

<xs:simpleType name="numberEnum">
    <xs:restriction base="xs:string">
        <xs:enumeration value="1"/>
        <xs:enumeration value="2"/>
        <xs:enumeration value="3"/>
    </xs:restriction>
</xs:simpleType>

谢谢。

我是EclipseLink产品的开发人员,一直在关注您的问题。未生成NumberEnum类,因为枚举值都是数字,这对于Java枚举无效。如果要通过
xjc
命令行工具运行模式,还将看到没有生成enum类

<xs:element name="customer" type="customerType"> </xs:element>

 <xs:complexType name="customerType">
    <xs:sequence>
        <xs:element name="number" type="numberEnum"/>
        <xs:element name="name" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

<xs:simpleType name="numberEnum">
    <xs:restriction base="xs:string">
        <xs:enumeration value="1"/>
        <xs:enumeration value="2"/>
        <xs:enumeration value="3"/>
    </xs:restriction>
</xs:simpleType>
一种解决方案是将枚举值更改为1、2、3,前提是您可以灵活地更改模式

<xs:element name="customer" type="customerType"> </xs:element>

 <xs:complexType name="customerType">
    <xs:sequence>
        <xs:element name="number" type="numberEnum"/>
        <xs:element name="name" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

<xs:simpleType name="numberEnum">
    <xs:restriction base="xs:string">
        <xs:enumeration value="1"/>
        <xs:enumeration value="2"/>
        <xs:enumeration value="3"/>
    </xs:restriction>
</xs:simpleType>
否则,解决这个问题的标准方法是使用JAXB绑定文件来定制枚举值:

<xs:element name="customer" type="customerType"> </xs:element>

 <xs:complexType name="customerType">
    <xs:sequence>
        <xs:element name="number" type="numberEnum"/>
        <xs:element name="name" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

<xs:simpleType name="numberEnum">
    <xs:restriction base="xs:string">
        <xs:enumeration value="1"/>
        <xs:enumeration value="2"/>
        <xs:enumeration value="3"/>
    </xs:restriction>
</xs:simpleType>
    <jxb:bindings
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
        version="2.1">
        <jxb:bindings schemaLocation="schema.xsd">

            <jxb:bindings node="//xs:simpleType[@name='numberEnum']/xs:restriction/xs:enumeration[@value='1']">
                <jxb:typesafeEnumMember name="ONE"/>
            </jxb:bindings>

            <jxb:bindings node="//xs:simpleType[@name='numberEnum']/xs:restriction/xs:enumeration[@value='2']">
                <jxb:typesafeEnumMember name="TWO"/>
            </jxb:bindings>

            <jxb:bindings node="//xs:simpleType[@name='numberEnum']/xs:restriction/xs:enumeration[@value='3']">
                <jxb:typesafeEnumMember name="THREE"/>
            </jxb:bindings>

        </jxb:bindings>
    </jxb:bindings>

然而,我们目前在EclipseLink Dynamic JAXB中有一个bug,并且没有考虑这种枚举定制。我们正在为我们的2.4.1版本进行此项工作,您可以在此处跟踪此错误的进度:

<xs:element name="customer" type="customerType"> </xs:element>

 <xs:complexType name="customerType">
    <xs:sequence>
        <xs:element name="number" type="numberEnum"/>
        <xs:element name="name" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

<xs:simpleType name="numberEnum">
    <xs:restriction base="xs:string">
        <xs:enumeration value="1"/>
        <xs:enumeration value="2"/>
        <xs:enumeration value="3"/>
    </xs:restriction>
</xs:simpleType>

<xs:element name="customer" type="customerType"> </xs:element>

 <xs:complexType name="customerType">
    <xs:sequence>
        <xs:element name="number" type="numberEnum"/>
        <xs:element name="name" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

<xs:simpleType name="numberEnum">
    <xs:restriction base="xs:string">
        <xs:enumeration value="1"/>
        <xs:enumeration value="2"/>
        <xs:enumeration value="3"/>
    </xs:restriction>
</xs:simpleType>
谢谢

<xs:element name="customer" type="customerType"> </xs:element>

 <xs:complexType name="customerType">
    <xs:sequence>
        <xs:element name="number" type="numberEnum"/>
        <xs:element name="name" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

<xs:simpleType name="numberEnum">
    <xs:restriction base="xs:string">
        <xs:enumeration value="1"/>
        <xs:enumeration value="2"/>
        <xs:enumeration value="3"/>
    </xs:restriction>
</xs:simpleType>

瑞克

谢谢瑞克。如果我错了,请纠正我,在这种情况下,枚举是字符串类型的,对吗?我试着用你说的字符串替换它,但它对我仍然不起作用。另外,如果我将模式作为输入,我是否能够使用绑定文件?我还可以尝试其他工作吗?1)枚举值是字符串,但是当XJC解析模式并尝试创建枚举类时,它不能使用字符串“1”作为Java标识符。2) 我用1/2/3替换了1/2/3,并且我能够运行您的测试用例-但是请注意,即使您的模式中有小写的“1”,XJC也会生成大写的枚举1,因此请确保您使用的是“context.getEnumConstant(“uic.numbernum”,“ONE”);“3)是的,您可以同时提供模式和XJB绑定文件,这里可以找到一个例子:出于某种原因,我的枚举类要求我将它们称为“generated.numbereum”,而所有其他类都可以使用包名。它现在可以与您的编辑一起工作。全局绑定部分似乎就是我想要的。谢谢
<xs:element name="customer" type="customerType"> </xs:element>

 <xs:complexType name="customerType">
    <xs:sequence>
        <xs:element name="number" type="numberEnum"/>
        <xs:element name="name" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

<xs:simpleType name="numberEnum">
    <xs:restriction base="xs:string">
        <xs:enumeration value="1"/>
        <xs:enumeration value="2"/>
        <xs:enumeration value="3"/>
    </xs:restriction>
</xs:simpleType>