2012-03-15 60 views
2

我使用Jersey和JAXB將我的響應轉換爲XML。我有幾種從Request Body中使用XML的方法。我可以指定bean作爲被調用方法的參數,JAXB將用於自動將請求主體數據轉換爲該bean,否則將失敗,如果它不兼容。使用JAXB在服務層中封裝bean

這對大多數我的情況非常有用,我沒有必要寫一個MessageBodyReader或MessageBodyWriter來處理來回轉換。我有這樣一個實例,我需要將請求主體映射到bean,但我還需要請求正文中的原始XML。我需要將其存儲在數據庫中。

我已經嘗試通過HttpContext獲取請求主體,並且無法弄清楚 - 我只看到了標頭值和URI值。我嘗試通過HTTPServletContext以及以相同的結果結束。

有沒有一種方法來捕獲請求主體,因爲它是在它被轉換之前或之後?我需要創建一個MessageBodyReader來處理這種情況嗎?看起來這些是用來映射內容到一個bean,我已經有了功能,所以我不認爲這是解決方案。但是,也許在MessageBodyReader中,我可以將請求主體放入某個變量並傳遞給它,同時仍然將數據轉換爲bean。這似乎仍然比需要更多的工作。我想我可以通過請求以某種方式到達身體。

更新: 我嘗試使用getEntity方法從ContainerRequest對象獲取正文。

String xmlString = request.getEntity(String.class); 

而且,這很好。請求主體被捕獲在該屬性中,我可以將它添加到請求屬性中,以便稍後訪問資源等。問題是,我認爲這是因爲實體是一個流,它清除了主體。所以在jaxb映射到bean的時候,沒有任何東西可以轉換,我得到了不好的請求響應。

這並沒有工作,但我想把它扔出去,如果有人可以讓它更好地工作。

這就是我最終做的,不用這樣做就好了。我基本上是在我的服務班裏編組什麼是未編組的。

final StringWriter st = new StringWriter(); 
try 
{ 

    final JAXBContext jaxbContext = JAXBContext.newInstance(full.classpath.and.classname.of.root.bean); 
    final Marshaller marshaller = jaxbContext.createMarshaller(); 
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
    marshaller.marshal(unmarshalled object, st); 
} catch (final JAXBException je) 
{ 
    // TODO Auto-generated catch block 
    je.printStackTrace(); 
} 
final String xml = st.toString(); 

所以你可以看到 - 我基本上採取了對象,根豆說,該機構解組來,和元帥它,給註解根bean中marhsalling使用的位置。

似乎有點redonkulous必須編組什麼已經unmarshalled,如果這是響應,也許編組在再出路。我想要一個解決方案,在解組發生之前,我可以抓取一份身體的副本。但在此期間,這將不得不起作用。

回答

0

我遇到了相同的情況下,用類似的結論結束了,除了我做的其他方式通過獲取它作爲一個字符串,然後手動編組爲避免不必要的JAXB工作,如:

String xmlString = request.getEntity(String.class); 
Reader sReader = new StringReader(xmlString); 
return (T)jaxbCtx.createUnmarshaller().unmarshal(sReader);  
+0

我喜歡正如你所說,這種方法可以避免不必要的JAXB工作。這是我的方法的問題。 – Elrond 2012-03-19 15:35:38