我正在使用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文件。所以,我需要对模式进行的任何更改都必须动态完成。
谢谢。
谢谢里克。如果我错了,请纠正我,在这种情况下,枚举是字符串类型的,对吗?我试图用你说的字符串替换它,但它仍然不适合我。另外,如果我将模式作为输入,我将能够使用绑定文件吗?有没有其他的工作可以尝试? – zzz
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 –
由于某种原因,我的枚举类需要我称它们为“生成的”。NumberEnum“,而其他所有的类都可以正确地处理包名,它现在可以正确处理你的编辑,全局绑定部分似乎就是我正在寻找的东西,谢谢! – zzz