我使用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,如果這是響應,也許編組在再出路。我想要一個解決方案,在解組發生之前,我可以抓取一份身體的副本。但在此期間,這將不得不起作用。
我喜歡正如你所說,這種方法可以避免不必要的JAXB工作。這是我的方法的問題。 – Elrond 2012-03-19 15:35:38