2010-08-13 63 views
1

我有以下代碼:IllegalAnnotationsException SetMultimap是一個接口,而JAXB無法處理接口

private SetMultimap<String, Dynamic> dynamicFields = TreeMultimap.create(Ordering.natural(), new Comparator<Dynamic>() { 
    @Override 
    public int compare(Dynamic o1, Dynamic o2) { 
    return o1.getTitle().compareTo(o2.getTitle()); 
    } 
}); 

使我有以下異常。

IllegalAnnotationsException SetMultimap is an interface, and JAXB can't handle interfaces 

我的問題是,如何走到這一步不工作,但這樣做:

List<Dynamic> test = new ArrayList<Dynamic>(); 

我怎樣才能解決SetMultimap使JAXB是幸福?

+0

JAXB從哪裏進來? – skaffman 2010-08-13 11:42:34

+0

它與這個問題有關嗎? – 2010-08-13 11:55:10

+0

是的,它是相關的。沒有關於JAXB如何找到該接口的上下文。 – skaffman 2010-08-14 11:06:08

回答

1

列表/ ArrayList和SetMultimap之間的區別在於,一個是Java集合,另一個是外部的數據結構正常的Java收集層次結構這意味着JAXB認爲它是一個普通的類。

JAXB規範不支持接口。您可能正在使用也不支持接口的Metro JAXB實現。一些JAXB實現如MOXy可以支持接口,但一些JAX-WS的實現依賴於特定的JAXB IMPL,而代以JAXB實現並不總是可能的:

你最好的辦法是使用參數級別註釋將SetMultimap轉換爲可由JAXB處理的類:

1

您需要添加註釋,告訴JAXB可能的運行時類型的引用,就像這樣:

@XmlElements({ 
@XmlElement(type = TreeMultimap.class, name = "treeMultimap"), 
@XmlElement(type = MultiHashMap.class, name = "hashMultimap") 
}) 
private SetMultimap<String, Dynamic> dynamicFields = TreeMultimap.create(Ordering.natural(), new Comparator<Dynamic>() { 
    @Override 
    public int compare(Dynamic o1, Dynamic o2) { 
    return o1.getTitle().compareTo(o2.getTitle()); 
    } 
}); 

有了上面的代碼,你也可以用MultiHashMap的實例替換該字段,如果你想。您需要爲每種可能的運行時類型添加一個@XmlElement。如果你永遠不會使用hash多重映射,一個@XmlElementTreeMultimap.class是不夠的:

@XmlElement(type = TreeMultimap.class, name = "treeMultimap") 
private SetMultimap<String, Dynamic> dynamicFields = TreeMultimap.create(Ordering.natural(), new Comparator<Dynamic>() { 
    @Override 
    public int compare(Dynamic o1, Dynamic o2) { 
    return o1.getTitle().compareTo(o2.getTitle()); 
    } 
}); 
+0

這沒有奏效。我收到異常說: 'com.google.common.collect.TreeMultimap沒有一個無參數默認構造函數.' TreeMultimap確實沒有任何無參數的默認構造函數。也許它不起作用。 – 2010-08-13 14:02:10

+0

JAXB有點瘋狂,因爲它期望每個對象都有一個默認構造函數和可變成員。不是很好的IMO。但是,有幾種方法可以解決這個問題。在你的情況下,我會去參加工廠班。使用@XmlType(factoryClass = MyFactory.class ...)爲包裝級別(如果可能,尚未嘗試過)或子類TreeMultimap聲明TreeMultimap的工廠。 – 2010-08-13 16:10:11

+0

如果我們在SO中有這個工作版本,那將是非常好的。 :)雖然我非常尊重明星川口康介,但我一直認爲他在做JAXB的時候很無聊,而且還沒有完成。 – 2010-08-15 16:55:26

相關問題