Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAXB(在Jersey JAX-RS中)是否可以支持XML和JSON格式的java.util.HashMap_Xml_Jaxb_Hashmap_Jersey_Jax Rs - Fatal编程技术网

JAXB(在Jersey JAX-RS中)是否可以支持XML和JSON格式的java.util.HashMap

JAXB(在Jersey JAX-RS中)是否可以支持XML和JSON格式的java.util.HashMap,xml,jaxb,hashmap,jersey,jax-rs,Xml,Jaxb,Hashmap,Jersey,Jax Rs,我正在使用JAX-RS的Jersey实现来创建RESTful服务。我希望该服务通过内置于JAX-RS中的非常方便的JAXB支持来支持XML和JSON响应 在我尝试使用java.util.HashMap之前,一切都运行得非常好(注意:您不能使用JAXB接口)。我惊讶地发现JAXB没有内置的XML映射支持,尽管Jackson JSON JAXB插件确实支持 第一次尝试: @XmlElement(name = "Links") HashMap<String, LinkDTO> links

我正在使用JAX-RS的Jersey实现来创建RESTful服务。我希望该服务通过内置于JAX-RS中的非常方便的JAXB支持来支持XML和JSON响应

在我尝试使用java.util.HashMap之前,一切都运行得非常好(注意:您不能使用JAXB接口)。我惊讶地发现JAXB没有内置的XML映射支持,尽管Jackson JSON JAXB插件确实支持

第一次尝试:

@XmlElement(name = "Links")
HashMap<String, LinkDTO> links = new HashMap<String, LinkDTO>();
<Links />
"Links": {
    "status": {
        ...
    },
    "cancel": {
        ...
    }
}
@XmlJavaTypeAdapter(HashMapAdapter.class)
@XmlElement(name = "Links")
HashMap<String, LinkDTO> links = new HashMap<String, LinkDTO>();

public class HashMapAdapter extends XmlAdapter<MapElement, HashMap<String, LinkDTO>> {
    public HashMap<String, LinkDTO> unmarshal(ArrayList<MapEntryType> jaxbDTO) throws Exception {
        ... mapping code ...
    }
    public MapElement marshal(HashMap<String, LinkDTO> map) throws Exception {
        ... mapping code ...
    }
}

public static class MapElement {
    @XmlElement(name = "Link")
    public List<MapEntryType> entries = new ArrayList<MapEntryType>();
}

public class MapEntryType {
    @XmlElement(name = "Key")
    public String key;

    @XmlElement(name = "Value")
    public RESTfulLinkDTO value;
}
<Links>
    <Link>
        <Key>status</Key>
        <Value> ... </Value>
    </Link>
    <Link>
        <Key>cancel</Key>
        <Value> ... </Value>
    </Link>
</Links>
"Links": {
    "Link": [
        {
            "Key": "status",
            "Value": {
                ...
            }
        },
        {
            "Key": "cancel",
            "Value": {
                ...
            }
        }
    ]
}   
因此,为了解决这个问题,我认为定制XmlAdapter可以解决这个问题,但这破坏了JSON序列化

第二次尝试:

@XmlElement(name = "Links")
HashMap<String, LinkDTO> links = new HashMap<String, LinkDTO>();
<Links />
"Links": {
    "status": {
        ...
    },
    "cancel": {
        ...
    }
}
@XmlJavaTypeAdapter(HashMapAdapter.class)
@XmlElement(name = "Links")
HashMap<String, LinkDTO> links = new HashMap<String, LinkDTO>();

public class HashMapAdapter extends XmlAdapter<MapElement, HashMap<String, LinkDTO>> {
    public HashMap<String, LinkDTO> unmarshal(ArrayList<MapEntryType> jaxbDTO) throws Exception {
        ... mapping code ...
    }
    public MapElement marshal(HashMap<String, LinkDTO> map) throws Exception {
        ... mapping code ...
    }
}

public static class MapElement {
    @XmlElement(name = "Link")
    public List<MapEntryType> entries = new ArrayList<MapEntryType>();
}

public class MapEntryType {
    @XmlElement(name = "Key")
    public String key;

    @XmlElement(name = "Value")
    public RESTfulLinkDTO value;
}
<Links>
    <Link>
        <Key>status</Key>
        <Value> ... </Value>
    </Link>
    <Link>
        <Key>cancel</Key>
        <Value> ... </Value>
    </Link>
</Links>
"Links": {
    "Link": [
        {
            "Key": "status",
            "Value": {
                ...
            }
        },
        {
            "Key": "cancel",
            "Value": {
                ...
            }
        }
    ]
}   

有没有任何可能的方法可以在不破坏JSON输出的情况下将HashMap数据输出为XML?只要所有数据都存在,我并不真正关心XML的具体布局是什么。对于这个问题,我更喜欢JAXB解决方案,但如果有一个Jersey配置可以解决这个问题,我会接受的。

地图似乎是JAXB的一个痛处

但是,如果您所做的相当简单,那么有一个相当简单的解决方案,即@XmlElementWrapper注释

以下是我的项目中的代码段:

@XmlElementWrapper(name="Parameters")
protected LinkedHashMap<String, String> parameters;
@xmlementwrapper(name=“Parameters”)
受保护的LinkedHashMap参数;
这将生成类似以下内容的XML:

<Parameters>
   <entry>
       <key>key-value</key>
       <value>value</value>
   </entry>
   ...
</Parameters>

关键值
价值
...
我不确定这是否适用于所有实现。我认为它适用于Jersey附带的JAXB和JAXB参考实现

我希望JAXB规范的未来修订版能够更好地支持映射。我希望有人能写/出版一本关于JAXB的相当全面的书