2012-06-23 76 views
3

我正在使用EclipseLink动态moxy for jaxb。当我尝试设置一个枚举值时,我得到一个ClassNotFound异常。任何人都可以指出我做错了什么?动态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文件。所以,我需要对模式进行的任何更改都必须动态完成。

谢谢。

回答

1

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

如果您有改变模式的灵活性,一种解决方案是将您的枚举值更改为一,二,三。

否则,要解决这个问题的标准的方式是通过使用JAXB绑定文件,自定义枚举值:

<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的动态JAXB的错误,并这个枚举定制没有被考虑在内。我们正在研究这个对我们2.4.1版本中,您可以在这里追踪这个bug的进展:

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

感谢,

里克

+0

谢谢里克。如果我错了,请纠正我,在这种情况下,枚举是字符串类型的,对吗?我试图用你说的字符串替换它,但它仍然不适合我。另外,如果我将模式作为输入,我将能够使用绑定文件吗?有没有其他的工作可以尝试? – zzz

+0

1)枚举值是字符串,但是当XJC解析模式并尝试创建一个枚举类时,它不能使用字符串“1”作为Java标识符。 2)我用ONE/TWO/THREE取代了1/2/3,并且我能够运行你的测试用例 - 但是请注意,即使你的模式中使用了小写的“one”,XJC也会生成一个大写的枚举ONE,所以一定要使用“context.getEnumConstant(”uic.NumberEnum“,”ONE“);” 3)是的,您可以提供模式和XJB绑定文件,可以在此处找到示例:http://wiki.eclipse.org/EclipseLink/UserGuide/MOXy/Runtime/Bootstrapping/From_Schema –

+1

由于某种原因,我的枚举类需要我称它们为“生成的”。NumberEnum“,而其他所有的类都可以正确地处理包名,它现在可以正确处理你的编辑,全局绑定部分似乎就是我正在寻找的东西,谢谢! – zzz