JAX-RS의 Jersey 구현을 사용하여 RESTful 서비스를 작성하고 있습니다. 서비스가 JAX-RS에 내장 된 매우 편리한 JAXB 지원을 통해 XML 및 JSON 응답을 모두 지원하기를 바랍니다.JAXB (Jersey JAX-RS)가 XML 및 JSON 형식의 java.util.HashMap을 지원할 수 있습니까?
java.util.HashMap (참고 : JAXB와 인터페이스를 사용할 수 없음)을 사용하기 전까지 모든 것이 멋지게 작동합니다. 잭슨 JSON JAXB 플러그인에는 지원이 있지만 JAXB에는 XML 용 맵에 대한 지원 기능이 내장되어 있지 않다는 것을 알게되었습니다.
첫 번째 시도 : 빈
@XmlElement(name = "Links")
HashMap<String, LinkDTO> links = new HashMap<String, LinkDTO>();
XML 출력 : 올바른
<Links />
JSON 출력 :
"Links": {
"status": {
...
},
"cancel": {
...
}
}
그래서 t o 사용자 지정 XmlAdapter가 트릭을 수행 할 것이라고 생각한 문제를 해결했지만 JSON serialization을 위반했습니다.
두 번째 시도 : 이제 허용
@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;
}
XML 출력 :
<Links>
<Link>
<Key>status</Key>
<Value> ... </Value>
</Link>
<Link>
<Key>cancel</Key>
<Value> ... </Value>
</Link>
</Links>
JSON 출력이 더 이상 유효한 자바 스크립트지도 :
"Links": {
"Link": [
{
"Key": "status",
"Value": {
...
}
},
{
"Key": "cancel",
"Value": {
...
}
}
]
}
JSON 출력을 중단하지 않고 HashMap 데이터를 XML로 출력 할 수있는 방법이 있습니까? XML의 특정 레이아웃이 모든 데이터가 존재하는 한 실제로 무엇인지는 신경 쓰지 않습니다. 이 문제에 대한 JAXB 솔루션을 선호하지만 해결할 저지 구성이 있다면이를 해결할 것입니다.