2012-06-23 122 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