2011-03-11 85 views
2

下面附帶的代碼會產生零星的測試失敗(JUnit),可以在80%的時間內運行。 我正在使用靜態模板對象。在發生故障的情況下,將不同於預期的JAXB對象置於來自transformer.transform(jaxbSource,result)方法調用的'result'中。JAXP-XSLT零星測試失敗

我試過了鎖,並且白白地同步了部分。另外模板對象應該根據規範是線程安全的。轉換中發生了一些奇怪的事情。

錯誤症狀:JUnit測試失敗 - 突然從變換中返回錯誤的對象。

任何想法?

private <S, T> S transform(final Templates template, final Class resultClass, final T data) throws JAXBException, TransformerException { 
    Transformer transformer = template.newTransformer(); 
    final JAXBSource jaxbSource = new JAXBSource(getCachedJAXBContext(data.getClass()), data); 
    final Result result = new JAXBResult(getCachedJAXBContext(resultClass)); 
    transformer.transform(jaxbSource, result); 
    return (S) ((JAXBResult) result).getResult(); 
} 
+2

不知道是什麼導致了它。將它標記爲「JAXB」並且更清楚地描述「零星測試失敗」的症狀會很有用,理想情況下提供的數據足以讓其他人重現問題。 – 2011-03-11 11:41:47

+0

是的,它與XSL樣式表和測試代碼的代碼很相似.. – 2011-03-11 13:29:47

+1

getCachedJAXBContext()是做什麼的?這可能會返回「錯誤」的內容?在變換之前嘗試記錄/打印'jaxbSource',以確保您正在改變自己的想法。 – 2011-03-11 13:51:03

回答

1

由於必須映射到相同的根元素名稱多個類,需要傳遞要解組作爲一個參數的解組操作的類型。這將意味着轉化成中間表示,如:DOM,字節[],字符串等:

private <S, T> S transform(final Templates template, final Class resultClass, final T data) throws JAXBException, TransformerException { 
    Transformer transformer = template.newTransformer(); 
    final JAXBSource jaxbSource = new JAXBSource(getCachedJAXBContext(data.getClass()), data); 
    final Result result = new DOMResult(); 
    transformer.transform(jaxbSource, result); 
    return (S) getCachedJAXBContext(resultClass).createUnmarshaller().unmarshal(new DOMSource(result.getNode()), resultClass).getValue(); 
} 

欲瞭解更多信息:

+0

是的,我在緩存JAXBContexts之前使用了這個構造。同樣的錯誤。 – 2011-03-16 12:09:01

+0

@Sigmund Lundgren - 你有多個具有相同@XmlRootElement註解的Java類嗎?那會導致這種行爲。 – 2011-03-16 12:15:43

+0

是的,我做..不同的軟件包,但同名。 – 2011-03-16 13:38:14