我正在使用EclipseLink动态moxy for jaxb。当我尝试设置枚举值时,我得到一个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文件。因此,我需要对架构进行的任何更改都必须动态完成。
感谢。
答案 0 :(得分:1)
我是EclipseLink产品的开发人员,一直在研究您的问题。未生成NumberEnum类,因为枚举值都是数字,这对于Java枚举无效。如果您通过xjc
命令行工具运行架构,您还会看到没有生成枚举类。
如果您可以灵活地更改架构,一种解决方案是将枚举值更改为ONE,TWO,THREE。
否则,解决此问题的标准方法是使用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 Dynamic JAXB中有一个错误,并且没有考虑此枚举自定义。我们正在为2.4.1版本进行此项工作,您可以在此处跟踪此错误的进度:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=383575
谢谢,
瑞克