jaxb - 动态moxy中枚举中的ClassNotFound异常

标签 jaxb xsd eclipselink classnotfoundexception moxy

我正在为 jaxb 使用 EclipseLink 动态 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>



Java代码:
    package uic;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

import javax.xml.bind.JAXBException;

import org.eclipse.persistence.dynamic.DynamicEntity;
import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext;
import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContextFactory;

public class test{

DynamicJAXBContext context;

test() {
    try{
        context = DynamicJAXBContextFactory.createContextFromXSD(new FileInputStream(new File("sample/NewXMLSchema1.xsd")), null, null, null);
    } catch(JAXBException e) {
        e.printStackTrace();
    } catch(FileNotFoundException e){
        e.printStackTrace();
    }

    DynamicEntity root = context.newDynamicEntity("CustomerType");

    root.set("name", "tom");

    Object enumValue = null;
    try {
        enumValue = context.getEnumConstant("uic.NumberEnum", "2");
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (JAXBException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    root.set("Number", enumValue);
}

public static void main(String args[]) {
    new test();
}
}

当我使用 createContextFromXSD() 创建上下文时我会出错吗?我按照这个例子:EclipseLink dynamic MOXy accessing enum values

我在访问其他 JAXB 生成的类时没有问题。问题仅适用于枚举类。它们是否放置在与其他生成的类不同的包中?

编辑:在主程序中,我收到一个 xml 模式文件作为输入。我使用 xsom 解析器来检索元素和类型声明,然后使用 JAXB 生成的类进行编码,以获取输出,即 XML 文件。因此,我需要对模式进行的任何更改都必须动态完成。

谢谢。

最佳答案

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

如果您可以灵活地更改架构,则一种解决方案是将枚举值更改为一、二、三。

否则,解决此问题的标准方法是使用 JAXB 绑定(bind)文件来自定义枚举值:

    <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 中有一个错误,并且没有考虑到这个枚举自定义。我们正在为我们的 2.4.1 版本开发此功能,您可以在此处跟踪此错误的进度:

https://bugs.eclipse.org/bugs/show_bug.cgi?id=383575

谢谢,

瑞克

关于jaxb - 动态moxy中枚举中的ClassNotFound异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11168819/

相关文章:

java - 在生成的代码中,如何访问 XSD 文件中声明的方面?

java - JAXB:package.package.<Type> 已在 package.package.<Type>.<Type> 中定义

java - EclipseLink 和 Spring OXM 继承问题

xml - Jersey 2 (JAXB) XML 元素案例,列表不支持 XmlRootElement

javax.xml.bind.UnmarshalException : unexpected element (uri :"", 本地 :"")。预期的元素是

xsd - 如何定义允许 base64 内容或 xop :Include element? 的 XML 架构元素

xml - 没有针对 Android 中的 XSD 验证 XML 的解决方案

orm - jpa2/eclipselink 合适的 DAO 结构是什么?

java - JPQL:SELECT NEW 查询中的枚举文字

java - 玻璃鱼 :MessageBodyProviderNotFoundException in Jersy Client