在編組期間,JAXB需要一個公共的無參數構造函數嗎?JAXB需要一個公共的無參數構造函數嗎?
Marshaller msh = ctx.createMarshaller();
msh.marshal(object, System.out);
我正在傳遞一個對象,而不是一個類。爲什麼JAXB需要一個構造函數?構建什麼?
在編組期間,JAXB需要一個公共的無參數構造函數嗎?JAXB需要一個公共的無參數構造函數嗎?
Marshaller msh = ctx.createMarshaller();
msh.marshal(object, System.out);
我正在傳遞一個對象,而不是一個類。爲什麼JAXB需要一個構造函數?構建什麼?
在編組操作期間,JAXB實現不應該需要無參數構造函數。 JAXB確實需要一個解組。通常,在創建JAXBContext時,缺少無參數構造函數會導致錯誤。您正在使用的JAXB實現可能會延遲初始化,直到執行實際操作。
通常,對於多參數構造函數的支持是我們在將來的JAXB版本中應該考慮的。在EclipseLink implementation of JAXB (MOXy),我們有一個增強請求打開此功能(隨意添加相關細節):
在JAXB的當前版本中,你可以使用一個XmlAdapter支持這種使用情況:
使用'XmlAdapter'我必須知道被編組的類的內部結構。在這種情況下,爲什麼我不能只添加一個無參數構造函數? – yegor256 2010-11-11 15:03:17
@Vincenzo你絕對可以添加一個無參數的構造函數。如果由於某種原因您無法修改您的模型類,則可以使用XmlAdapter。 – 2010-11-11 15:15:41
與許多框架相同 - 簡單性和一致性。它允許庫簡單地調用Class.newInstance(),而不必擔心如何爲構造函數指定某些依賴項。 JAXB不希望關注全面的依賴注入,並超出了基於屬性的設置。
這在某種程度上是一種遺憾,因爲這意味着這些類不可能是不可改變的,但這是一個權衡。
正如其他人所指出的,它不應該真正需要的人,但(至少在Sun的實施中)它確實如此。你可以用虛擬構造函數來解決這個問題:
private MyObject() {
throw new UnsupportedOperationException("No-arg constructor is just to keep JAXB from complaining");
}
你不能在這裏拋出異常,JAXB實際上使用這個c-tor – Derp 2016-11-15 16:36:13
這取決於JAXB是否正在構造對象或是否(作爲OP註釋)(http://stackoverflow.com/questions/4155361/what- jaxb-needs-a-public-no-arg-constructor-for/12921496?noredirect = 1#comment4484733_4155388))你正在自己構造它並將一個實例傳遞給'marshal()'。 – 2016-11-16 17:54:48
Nitpick:我很確定它不需要* public * no-arg構造函數。它只需要* any * no-arg構造函數。如果你喜歡,它可以被保護/私人/包裝私人。 – MatrixFrog 2011-06-02 18:08:04