2013-01-07 61 views
2

我在玩JAXB,所以我問的很多問題都只是爲了看看有什麼可能。XmlAdapter沒有調用List來映射

我有下面的XML:

<bundleMappings> 
    <mapping> 
     <parameter attr = "value">asdas</parameter> 
     <parameter attr = "value2">d123asdsad</parameter> 
     <parameter attr = "value3">0</parameter> 
    </mapping> 
    <mapping> 
     <parameter attr = "value">23123s</parameter> 
     <parameter attr = "value2">qwerty</parameter> 
     <!-- more parameter elements --> 
    </mapping> 
    <!-- more mapping elements --> 
</bundleMappings> 

在這我想parameter元素是在一個Map<String, Parameter>,而不是一個列表,其中的關鍵是attr值和值的內容元素。我已經關注了一些博客帖子並提出了這個問題。

@XmlRootElement(name = "bundleMmappings") 
public class BundleMappings { 
    @XmlElement(name = "mapping") 
    private List<Mapping> mMappings; 

    //getters setters 
} 

@XmlAccessorType(XmlAccessType.FIELD) 
public class Mapping { 
    @XmlElement 
    @XmlJavaTypeAdapter(ParameterAdapter.class) 
    private HashMap<String, Parameter> mParameterMap; 

    //getters setters 
} 

@XmlAccessorType(XmlAccessType.FIELD) 
public class Parameter { 
    @XmlAttribute(name = "attr") 
    private String mName; 

    @XmlValue 
    private String mValue; 

    //getters setters 
} 

@XmlAccessorType(XmlAccessType.FIELD) 
public class Parameters { 
    @XmlElement(name = "parameters") 
    private List<Parameter> parameters = new LinkedList<>(); 

    //getters setters 
} 

和適配器:

public class ParameterAdapter extends XmlAdapter<Parameters, Map<String, Parameter>> { 

    @Override 
    public Parameters marshal(Map<String, Parameter> map) throws Exception { 
     Parameters params = new Parameters(); 
     params.setParameters(new ArrayList<Parameter>()); 
     for (String name : map.keySet()) { 
      Parameter p = new Parameter(); 
      p.setName(name); 
      p.setValue(map.get(name).getValue()); 
      params.getParameters().add(p); 
     } 
     return params; 
    } 

    @Override 
    public Map<String, Parameter> unmarshal(Parameters value) throws Exception { 
     Map<String, Parameter> map = new HashMap<>(); 
     for (Parameter parameter : value.getParameters()) { 
      map.put(parameter.getName(), parameter); 
     } 
     return map; 
    } 
} 

我做了斷點小的解組測試在適配器unmarshal,它不叫的。爲什麼不?

我也試過註釋MappingList@XmlElement(name = "parameter")。在這種情況下,unmarshall被調用,但傳遞給它的Parameters參數有一個空列表。

編輯

如果我嘗試元帥:

<bundleMappings> 
    <mapping> 
     <mParameterMap> 
      <parameter name="HOME_NETWORK_ID">12345</parameter> 
     </mParameterMap> 
    </mapping> 
</bundleMappings> 

回答

2

當它應用於集合中的項目集合屬性指定XmlAdapter

public class Mapping { 
    @XmlElement 
    @XmlJavaTypeAdapter(ParameterAdapter.class) 
    private List<Parameter> mParameters; 

    //getters setters 
} 

這意味着ParameterAdapter需要看起來像,其中Foo是要Parameter轉換成什麼:

public class ParameterAdapter extends XmlAdapter<Foo, Parameter> { 

圖示例,

下面是一個例子的鏈接來自我的博客XmlAdapter用於Map屬性:

+0

@SotiriosDelimanolis - 是的,你在你的問題有名單所以我剛纔複製下來給我的答案。 –

+0

@SotiriosDelimanolis - XML表示將與您所期望的不同。我的建議是創建對象的實例並將其編組爲XML,您將看到預期的輸入。 –

+0

@SotiriosDelimanolis - 由於您在註釋字段,請確保您在所有類中指定了「@XmlAccessorType(XmlAccessType)」:http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html –