2012-08-30 1 views
3

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 솔루션을 선호하지만 해결할 저지 구성이 있다면이를 해결할 것입니다.

답변

1

지도가 JAXB에서 아픈 지점 인 것 같습니다.

그러나, 당신이하고있는 일이 상당히 간단하다면, @XmlElementWrapper 주석의 형태로 상당히 간단한 해결책이 있습니다. 여기

내 프로젝트에서 코드 세그먼트 :

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

나는이 모든 구현을 위해 작동하는지 확실하지 않다 :

@XmlElementWrapper(name="Parameters") 
protected LinkedHashMap<String, String> parameters; 

이 다소처럼 보이는 XML을 생성합니다. Jersey와 함께 제공되는 JAXB 및 JAXB 참조 구현과 함께 작동한다고 생각합니다.

앞으로 JAXB 사양의 일부 개정판이지도를 더 잘 지원할 것이라는 희망이 있습니다. 그리고 제 희망은 누군가가 JAXB에 관해 상당히 철저한 책을 저술하거나 출판 할 것이라는 것입니다.

관련 문제