没有调用XmlAdapter来使List适应Map

时间:2013-01-07 21:17:16

标签: java xml jaxb

我正在玩JAXB,所以我要问的很多问题只是为了看看有什么可能。

我有以下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>而不是List中,其中键是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中使用断点进行了一次小型的解组测试,但根本没有调用它。为什么不呢?

我还尝试用Mapping注释List@XmlElement(name = "parameter")。在这种情况下,unmarshall被调用,但传递给它的Parameters参数有一个空列表。

修改

如果我试图编组:

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

1 个答案:

答案 0 :(得分:2)

在集合属性上指定XmlAdapter时,它将应用于集合中的项目。

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

    //getters setters
}

这意味着ParameterAdapter需要看起来像Foo是您要将Parameter转换为:{/ p>

public class ParameterAdapter extends XmlAdapter<Foo, Parameter> {

地图示例

以下是我博客中XmlAdapter属性使用Map的示例的链接: