2013-03-05 17 views
2

免責聲明:我在這一切jaxbcontext.newinstance()與EclipseLink的莫西掛起

我試圖讓我的XML工作輸出JSON除了項目令人難以置信的業餘愛好者。 最初,這樣做的方法涉及一種方法,它接受Element參數並遞歸插入net.sf JSONObject類型的對象以創建JSON輸出,並使用正常的JAXBContextMarshaller編組爲XML。

我想要的是將MOXy用作我的JAXB提供程序,然後從綁定中編組XML和JSON。

最初,XML被編組的時候,我有:

jc = JAXBContext.newInstance("packageA:packageB:packageC...etc."); 
public static String marshal(JAXBContext context, JAXBElement<?> je) throws JAXBException { 
    StringWriter sout = new StringWriter(); 
    Marshaller m = context.createMarshaller(); 
    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.FALSE); 
    m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); 
    m.marshal(je, sout); 
    return sout.toString(); 
} 

然後

(這可能是重要的,所以我應該提到的是應用我在使用彈簧框架。)

此外,我讀過每一個關於EclipseLink的Blaise博客帖子。有幾次。我只是它的一個非常粗淺的認識而會如果升值鏈接我到他的一個頁面,你解釋是它的任何解決方案,以及爲什麼它的工作原理

話雖這麼說,我嘗試了包括jaxb.properties文件其中一個試圖獲得MOXY的軟件包,而不是JAXBElement來獲得我的綁定。但是,JAXBContext.newInstance("my list of : delimited packages")只是使程序掛起。甚至沒有錯誤,只是掛起它。單步顯示調用EclipseLink newInstance方法掛起。 我在網上搜索了很多小時的解決方案。我有太多的類只包含在一個Class []中,所以不能通過使用一個類的數組來設置屬性。這也是我無法使用本機moxy API而不是使用屬性文件的原因。我認爲我的EclipseLink設置正確:我在我的環境變量中設置了eclipselink_home,並將eclipselink.jar添加到了我的構建路徑中。

+0

P.S.對於我差勁的大寫字母和格式的追溯道歉。 – 2013-03-05 21:44:48

回答

1

更新#2

針對此問題的修復已經簽入的EclipseLink 2.4.2和2.5.0流和包含修復每晚構建可從以下鏈接開始3月12日下載2013


更新#1

經過幾次電子郵件交流,我認爲你遇到的問題是由於以下錯誤。您可以使用該鏈接跟蹤我們在這個問題上的進展情況。

我將演示如何表現如下:

的ObjectFactory

針對該問題的發生,你需要有一個@XmlElementDecl註釋,其中name是與substitutionHeadName相同。

@XmlRegistry 
public class ObjectFactory { 

    @XmlElementDecl(name="foo", substitutionHeadName="foo") 
    public JAXBElement<Foo> createBar(Foo foo) { 
     return new JAXBElement<Foo>(new QName("foo"), Foo.class, foo); 
    } 

} 

域對象(美孚)

然後在您的域的一個對象,你需要有一個@XmlElementRef註釋引用我們在@XmlElementDecl定義的元素。

public class Foo { 

    @XmlElementRef(name="foo") 
    public Foo foo; 

} 

演示

你會看到這個問題,當你創建JAXBContext

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Foo.class, ObjectFactory.class); 
     System.out.println(jc.getClass()); 
    } 

} 

痕量

MOXY得到無限循環將基準元件。

... 
    at org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.addReferencedElement(AnnotationsProcessor.java:3740) 
    at org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.addReferencedElement(AnnotationsProcessor.java:3740) 
    at org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.addReferencedElement(AnnotationsProcessor.java:3740) 
    at org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.addReferencedElement(AnnotationsProcessor.java:3740) 
    at org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.addReferencedElement(AnnotationsProcessor.java:3740) 
    at org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.addReferencedElement(AnnotationsProcessor.java:3740) 
    at org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.addReferencedElement(AnnotationsProcessor.java:3740) 
    at org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.addReferencedElement(AnnotationsProcessor.java:3740) 
    at org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.addReferencedElement(AnnotationsProcessor.java:3740) 
... 

原來的答案

你可以嘗試使用下面創建您JAXBContext。它通過使用本地MOXY代碼繞過標準的JAXB impl查找代碼。

JAXBContext jc = org.eclipse.persistence.jaxb.JAXBContextFactory.createContext("packageA:packageB:packageC...etc."); 

如果有效,我們會知道問題與impl查找代碼有關,我們可以從那裏開始。

+0

我得到 類型JAXBContextFactory中的方法createContext(String,ClassLoader)不適用於參數(String) 我需要從某處獲取類加載器嗎?如果是這樣的話(或者更確切地說,如果我傳遞了一堆軟件包而不是一個類,我甚至會得到什麼類加載器?) – 2013-03-05 21:39:06

+0

@MiloHou - 只需將'null'傳遞給'ClassLoader'即可。 – 2013-03-05 21:45:23

+0

好的。我不確定是否有必要。我應該刪除其中一個包中的屬性文件,還是不重要?嘗試使用該代碼行仍會使程序掛起(無論是否帶有屬性文件)。 請注意:JAXBContext jc應該是javax.bind.JAXBContext或org.eclipse類型的JAXBContext類型嗎? P.S.建立上下文需要多長時間?在生成xml之前它只需要大約10秒鐘之前,moxy jaxbcontext是否需要更長時間才能創建? P.P.S對不起牆 – 2013-03-05 21:51:20

相關問題