접기
1차적으로 그냥 HashMap 형식으로 Marshaller 를 만들어서 처리를 하였으나...
결과는
javax.xml.bind.MarshalException
- with linked exception:
[com.sun.istack.internal.SAXException2: unable to marshal type "java.util.HashMap" as an element because it is missing an @XmlRootElement annotation]
안되는 것이지요...
그래서 클래스로 감싸서 처리해보았습니다.
ContentData.java
테스트는 아래와 같이 한 후 확인해보면...
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<content>
<contentMap>
<entry>
<key xsi:type="xs:string" xmlns:xs=" http://www.w3.org/2001/XMLSchema " xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance">abc</key >
<value xsi:type="xs:string" xmlns:xs=" http://www.w3.org/2001/XMLSchema " xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance">abcd</value >
</entry>
<entry>
<key xsi:type="xs:string" xmlns:xs=" http://www.w3.org/2001/XMLSchema " xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance">abc1</key >
<value xsi:type="xs:string" xmlns:xs=" http://www.w3.org/2001/XMLSchema " xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance">abcd</value >
</entry>
</contentMap>
</content>
필요 없는 데이터가 길어져버렸습니다.
이러면 안되기에 JavaDoc 을 더 훑어본 후
@XmlJavaTypeAdapter 라는 것을 찾아내었습니다.
ContentData 클래스의 contentData 객체의 어노테이션을 추가합니다.
HashMapAdapter.java
KeyValuePair.java
테스트를 해보았습니다.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<content>
<contentMap>
<item value="abcd" key="abc"/>
<item value="abcd" key="abc1"/>
</contentMap>
</content>
{abc=abcd, abc1=abcd}
Marshalling 도 잘되고
Unmarshalling 도 잘됩니다. ㅋㅋㅋ
접기
원래 JAXB 는 JAX-WS 때문에 나온 거 같은데 요긴하게 잘 써먹고 있습니다.