2010-11-11 94 views
15

在編組期間,JAXB需要一個公共的無參數構造函數嗎?JAXB需要一個公共的無參數構造函數嗎?

Marshaller msh = ctx.createMarshaller(); 
msh.marshal(object, System.out); 

我正在傳遞一個對象,而不是一個類。爲什麼JAXB需要一個構造函數?構建什麼?

+0

Nitpick:我很確定它不需要* public * no-arg構造函數。它只需要* any * no-arg構造函數。如果你喜歡,它可以被保護/私人/包裝私人。 – MatrixFrog 2011-06-02 18:08:04

回答

6

在編組操作期間,JAXB實現不應該需要無參數構造函數。 JAXB確實需要一個解組。通常,在創建JAXBContext時,缺少無參數構造函數會導致錯誤。您正在使用的JAXB實現可能會延遲初始化,直到執行實際操作。

通常,對於多參數構造函數的支持是我們在將來的JAXB版本中應該考慮的。在EclipseLink implementation of JAXB (MOXy),我們有一個增強請求打開此功能(隨意添加相關細節):

在JAXB的當前版本中,你可以使用一個XmlAdapter支持這種使用情況:

+0

使用'XmlAdapter'我必須知道被編組的類的內部結構。在這種情況下,爲什麼我不能只添加一個無參數構造函數? – yegor256 2010-11-11 15:03:17

+2

@Vincenzo你絕對可以添加一個無參數的構造函數。如果由於某種原因您無法修改您的模型類,則可以使用XmlAdapter。 – 2010-11-11 15:15:41

4

與許多框架相同 - 簡單性和一致性。它允許庫簡單地調用Class.newInstance(),而不必擔心如何爲構造函數指定某些依賴項。 JAXB不希望關注全面的依賴注入,並超出了基於屬性的設置。

這在某種程度上是一種遺憾,因爲這意味着這些類不可能是不可改變的,但這是一個權衡。

+0

只要您沒有指定構造函數中的哪個參數,我就沒有辦法讓JAXB找到它。反射api只給出類型,構造函數的參數沒有名字。它應該如何知道第一個參數(String)是名稱而不是這樣的ID或sthg? – ZeissS 2010-11-11 14:32:49

+1

自我修正:註釋可能會解決這個問題... – ZeissS 2010-11-11 14:34:06

+3

我知道公共的無參數構造函數是什麼,但爲什麼在編組期間JAXB需要它?我將一個實例傳遞給'marshal()',而不是一個類。 – yegor256 2010-11-11 14:38:52

5

正如其他人所指出的,它不應該真正需要的人,但(至少在Sun的實施中)它確實如此。你可以用虛擬構造函數來解決這個問題:

private MyObject() { 
    throw new UnsupportedOperationException("No-arg constructor is just to keep JAXB from complaining"); 
} 
+0

你不能在這裏拋出異常,JAXB實際上使用這個c-tor – Derp 2016-11-15 16:36:13

+0

這取決於JAXB是否正在構造對象或是否(作爲OP註釋)(http://stackoverflow.com/questions/415536​​1/what- jaxb-needs-a-public-no-arg-constructor-for/12921496?noredirect = 1#comment4484733_4155388))你正在自己構造它並將一個實例傳遞給'marshal()'。 – 2016-11-16 17:54:48

相關問題