java - JAXB map 适配器

标签 java xml jaxb

我在将 XML 复杂类型转换为 java.util.Map 时遇到问题。解码时,仅填充值,而键变为 NULL。我希望将以下 XML 转换为 java.util.Map<"user_type","students">但它的到来就像 java.util.Map<NULL,"students"> 。有人可以告诉我为什么我的 key 为 NULL 吗?

XML

<root>
  <myMap>
    <user_type>students</user_type>
  </myMap>
</root>

POJO

@XmlRootElement(name = "root")
@XmlAccessorType(XmlAccessType.FIELD)
public class MyPojo implements Serializable {

private static final long serialVersionUID = -4589166768649033266L;

@XmlElement(name = "myMap")
@XmlJavaTypeAdapter(MapAdapter.class)
private Map<String,String> myMap;

 //getters and setters
}

MapAdapter 实现是 http://blog.bdoughan.com/2013/06/moxys-xmlvariablenode-using-maps-key-as.html

@Override
public Map<String, String> unmarshal(AdaptedMap adaptedMap) throws Exception {
    List<AdaptedEntry> adaptedEntries = adaptedMap.entries;
    Map<String, String> map = new HashMap<String, String>(adaptedEntries.size());
    for(AdaptedEntry adaptedEntry : adaptedEntries) {
        map.put(adaptedEntry.key, adaptedEntry.value);
    }
    return map;
}

最佳答案

我看到的第一个错误是您使用的是 Map<String, Integer>映射,而您的 XML 有一个字符串值。

按如下方式更改代码:

public class MapAdapter extends XmlAdapter<MapAdapter.AdaptedMap, Map<String, String>> {

    public static class AdaptedMap {

        @XmlVariableNode("key")
        List<AdaptedEntry> entries = new ArrayList<AdaptedEntry>();

    }

    public static class AdaptedEntry {

        @XmlTransient
        public String key;

        @XmlValue
        public String value;

    }

    @Override
    public AdaptedMap marshal(Map<String, String> map) throws Exception {
        AdaptedMap adaptedMap = new AdaptedMap();
        for(Entry<String, String> entry : map.entrySet()) {
            AdaptedEntry adaptedEntry = new AdaptedEntry();
            adaptedEntry.key = entry.getKey();
            adaptedEntry.value = entry.getValue();
            adaptedMap.entries.add(adaptedEntry);
        }
        return adaptedMap;
    }

    @Override
    public Map<String, String> unmarshal(AdaptedMap adaptedMap) throws Exception {
        List<AdaptedEntry> adaptedEntries = adaptedMap.entries;
        Map<String, String> map = new HashMap<String, String>(adaptedEntries.size());
        for(AdaptedEntry adaptedEntry : adaptedEntries) {
            map.put(adaptedEntry.key, adaptedEntry.value);
        }
        return map;
    }

}

在您的 MyPojo 中类,您需要指定需要将哪个 XML 元素映射为 Map .

@XmlElement(name = "myMap"),
@XmlJavaTypeAdapter(MapAdapter.class)
private Map<String,String> myMap;

关于java - JAXB map 适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29847343/

相关文章:

java - 如何获取 JIRA 中自定义字段的所有值?

java - java native 内存跟踪输出中的"Internal"

java - JFrame 未调整大小以适合 JPanel

java - 帮助使用 Jettison 将 JSON Twitter 答案映射到 Jaxb

java - OXM:映射变量元素名称

java - 如何更改无状态 EJB 的 Web 服务端点的 http session 超时?

java - 什么可能导致 RequestMappingHandlerMapping 无法正确注册?

Ruby Nokogiri SAX 解析器在 "&gt;"(又名 ">")处截断字符串

sql - 在 SQL 中从 XML 中选择值

java - jaxb 解码子 @XmlIDREF