2014-06-13 60 views
2

http://blog.bdoughan.com/2013/06/moxy-is-new-default-json-binding.html大約一半的時候有一個標題「自定義JSON綁定」。你如何類似地自定義XML綁定?澤西島+ Moxy + JAXB - 如何編組沒有註釋的XML

Jersey處理Moxy JSON綁定和XML等價物的方式似乎存在根本差異。如果按照Jersey文檔中的說明創建自定義JAXBContext解析器來配置Moxy的映射文件,那麼解析器將在JSON情況下觸發,而不是在XML情況下觸發。看到https://bitbucket.org/jmetcher/resttest/爲一個非常小的項目演示這一點。

我擁有正確的jaxb.properties文件,並且正在使用jersey-media-moxy模塊進行構建。我可以在獨立模式下獲得相同的Moxy JAXB設置,但我無法讓Jersey注意到它。

我所做的調試表明,要實現這個功能的唯一方法是創建一個自定義的MessageBodyWriter。 jersey-media-moxy模塊註冊一個JSON MessageBodyWriter,然後它將調用任何已註冊的ContextResolver。它沒有爲XML註冊等效的MessageBodyWriter,並且Jersey的默認MBW似乎完全忽略了註冊的ContextResolver。

不管怎樣,創建自定義MessageBodyWriter的需求從文檔中完全沒有,幾乎每個示例都似乎表明我缺少一些基本的東西。

我會提供更多信息的鏈接,但我似乎沒有代表在SO上做很多事情。

編輯:在回答更多信息以註釋:

莫西肯定是被拾起爲JAXB提供商。我可以在調試器中看到這一點。

Jersey版本是2.9,EclipseLink版本是2.5。 Java 7.

ContextResolver方法適用於JSON。在Application類中註冊MoxyXMLFeature的方法也是如此。在這兩種情況下,均使用使用正確的映射文件配置的正確上下文。在XML案例中,澤西似乎從未嘗試創建上下文。

但是,如果我將@XmlRootElement註釋添加到我試圖編組的類中,這一切都可行。即使沒有其他註釋,根據oxm映射文件,該類可以封送到XML和JSON。我已經更新了bitbucket項目來展示這一點。

因此,我可以通過創建自定義MBW或提供註釋的根類來解決此問題。我想在這一點上,我要制定出最好或推薦的方法,以便我可以記錄文檔補丁。

回答

1

這確實是只有這樣,才能使用澤西+莫西是註冊元帥的無註明域模型到XML的情況下你自己的提供者(又名MessageBodyWriter/MessageBodyReader)。

編組未經註釋的模型支持Moxy功能。然而,Jersey的默認JAXB提供程序通過要求模型在將控制權交給Moxy之前進行註釋來掩蓋此功能。 JSON案例的實現方式不同,並沒有此限制。

請參閱http://lagod.id.au/blog/?p=472瞭解完整的工作示例。

Doc bug報告:https://java.net/jira/browse/JERSEY-2552

1

要讓Jersey選擇MOXy作爲JAXB提供商,您只需在與您的域模型相同的包中添加jaxb.properties文件,其中包含正確的條目(請參閱:http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html)。對於JAX-RS,如果沒有指定ContextResolver,則此包需要與使用JAX-RS註釋映射的服務中的方法的參數對應,或從中返回類型。

注:

有在新澤西州的早期版本,阻止莫西被拾起作爲默認的JAXB提供者,在這種情況下,你可以一個錯誤:

  1. 升級至更新版本的Jersey。
  2. 創建ContextResolver返回一個莫西JAXBContext的一個實例(參見:http://blog.bdoughan.com/2011/04/moxys-xml-metadata-in-jax-rs-service.html

在的情況下,ContextResolver你可以使用代碼直接創建莫西的JAXBContext而不是利用一個jaxb.properites文件。請參閱選項#2我聯繫下面的回答:

+0

Blaise,謝謝你的回答。手動創建JAXBContext可以正常工作 - 從最後一個鏈接中選擇#1和選項#2。問題是,在澤西島,JAXBContext根本就沒有創建完全沒有註解的類。澤西島的默認XML MBW似乎決定前面,因爲沒有註釋它不能處理類,並在那裏炸彈 - 儘管事實上,如果它實際上創建JAXBContext都會正常工作。 – jmetcher