![](/img/trans.png)
[英]JAXB @XmlAdapter: Map -> List adapter? (marshall only)
[英]JAXB with XmlAdapter for List to Map. Does not marshall as expected but outputs object details
我需要將列表(小工具)轉換為地圖。 因此使用XmlAdapter。
架構
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
targetNamespace="http://jaxb.com/schema" xmlns:test="http://jaxb.com/schema">
<xs:element name="Person">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="gadgets" type="test:GadgetMapModeller" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="GadgetMapModeller">
<xs:sequence>
<xs:element name="entry" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="key" type="xs:string"/>
<xs:element name="value" type="test:gadget"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="gadget">
<xs:sequence>
<xs:element name="make" type="xs:string"/>
<xs:element name="model" type="xs:string"/>
<xs:element name="year" type="xs:int"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Computer">
<xs:complexContent>
<xs:extension base="test:gadget">
<xs:sequence>
<xs:element name="speed" type="xs:int"/>
<xs:element name="cpu" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
適配器
package com.jaxb;
import java.util.Map;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import com.jaxb.schema.Gadget;
import com.jaxb.schema.GadgetMapModeller;
public class GadgetMapAdapter extends XmlAdapter<GadgetMapModeller, GadgetMap<String,Gadget>>
{
@Override
public GadgetMap<String,Gadget> unmarshal(GadgetMapModeller modeller)
{
GadgetMap<String,Gadget> map = new GadgetMap<String,Gadget>();
for (GadgetMapModeller.Entry e : modeller.getEntry())
{
map.put(e.getKey(), e.getValue());
}
return map;
}
@Override
public GadgetMapModeller marshal(GadgetMap<String,Gadget> map)
{
GadgetMapModeller modeller = new GadgetMapModeller();
for (Map.Entry<String,Gadget> entry : map.entrySet())
{
GadgetMapModeller.Entry e = new GadgetMapModeller.Entry();
e.setKey(entry.getKey());
e.setValue(entry.getValue());
modeller.getEntry().add(e);
System.out.println("entry.getValue()" + entry.getValue());
}
return modeller;
}
}
GadgetMap
package com.jaxb;
import java.util.HashMap;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlJavaTypeAdapter(GadgetMapAdapter.class)
public class GadgetMap<String,Gadget> extends HashMap<String,Gadget>
{
}
在調試時,我發現調用了XmlAdapter.marshal方法,我可以看到里面對象的值。 但收到的輸出如下。
產量
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:Person xmlns:ns2="http://jaxb.com/schema">
<ns2:name>Matt Shannon</ns2:name>
<ns2:gadgets>
<entry>
<key>my ipad</key>
<value>
<ns2:make>Apple</ns2:make>
<ns2:model>iPod</ns2:model>
<ns2:year>2002</ns2:year>
</value>
</entry>
<entry>
<key>my laptop</key>
<value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:Computer">
com.jaxb.Computer@704f568
</value>
</entry>
</ns2:gadgets>
</ns2:Person>
為什么它沒有正確編組並產生 - com.jaxb.Computer@704f568 ? 你能幫幫我看看嗎?
你有沒有正確初始化JAXBContext(它必須知道計算機),easiert是有
@XmlSeeAlso(Computer.class)
public class Gadget {
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.