我正在使用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