SOAP 経由で Hashmap を渡そうとしています。CXF wsdl2java を使用してスキーマを作成しています。また、Hashmap 自体は行を介して渡すことができないため、HashMap のラッパー クラスを作成しました。
次に、その Hashmap を wsdl の既知のタイプに変換するアダプターを作成しましたが、wsdl が作成されると、不要な抽象マップが追加されます。以下はコードです:
これは、HashMap のラッパー クラスです。
@XmlRootElement(name = "testTO")
public class TestTO {
private HashMap<String, Object> mapTest;
public TestTO(){
this.mapTest = new HashMap<String, Object>();
}
@XmlJavaTypeAdapter(MapAdapter.class)
public HashMap<String, Object> getMapTest() {
return mapTest;
}
public void setMapTest(HashMap<String, Object> mapTest) {
this.mapTest = mapTest;
}
}
これは、既知のスキーマ タイプである MyMap クラスです。
@XmlJavaTypeAdapter(MapAdapter.class)
public class MyMap extends HashMap<String, Object>{
public final List<Entry> entryList = new ArrayList<Entry>();
}
これは、そのリストに上記が含まれるエントリ クラスです。
public class Entry {
@XmlAttribute
public String key;
@XmlElements({
@XmlElement(name = "byte", type = byte.class),
@XmlElement(name = "short", type = short.class),
@XmlElement(name = "int", type = int.class),
@XmlElement(name = "long", type = long.class),
@XmlElement(name = "float", type = float.class),
@XmlElement(name = "double", type = double.class),
@XmlElement(name = "char", type = char.class),
@XmlElement(name = "boolean", type = boolean.class),
@XmlElement(name = "ByteWrapper", type = Byte.class),
@XmlElement(name = "ShortWrapper", type = Short.class),
@XmlElement(name = "IntegerWrapper", type = Integer.class),
@XmlElement(name = "LongWrapper", type = Long.class),
@XmlElement(name = "FloatWrapper", type = Float.class),
@XmlElement(name = "DoubleWrapper", type = Double.class),
@XmlElement(name = "Character", type = Character.class),
@XmlElement(name = "BooleanWrapper", type = Boolean.class),
@XmlElement(name = "BigDecimal", type = BigDecimal.class),
@XmlElement(name = "String", type = String.class),
@XmlElement(name = "Date", type = Date.class)
})
public Object value;
public Entry() {
this.key = null;
this.value = null;
}
public Entry(String key, Object value) {
this.key = key;
this.value = value;
}
public String getKey() {
return key;
}
public Object getValue() {
return value;
}
}
これは私のアダプターです:
public class MapAdapter extends XmlAdapter<MyMap, Map<String, Object>> {
@Override
public MyMap marshal(Map<String, Object> v) throws Exception {
MyMap myMap = new MyMap();
for ( Map.Entry<String, Object> e : v.entrySet() ) {
Entry entry = new Entry();
entry.key = e.getKey();
entry.value = e.getValue();
myMap.entryList.add(entry);
}
return myMap;
}
@Override
public Map<String, Object> unmarshal(MyMap v) throws Exception {
Map<String, Object> map = new HashMap<String,Object>();
for ( Entry e : v.entryList ) {
map.put(e.key, e.value);
}
return map;
}
}
しかし、私のwsdlは次を生成しています:
<xs:element minOccurs="0" name="foo" type="tns:testTO"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="testTO">
<xs:sequence>
<xs:element minOccurs="0" name="mapTest" type="tns:myMap"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="myMap">
<xs:complexContent>
<xs:extension base="tns:hashMap">
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="entryList" nillable="true" type="tns:entry"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="hashMap">
<xs:complexContent>
<xs:extension base="tns:abstractMap">
<xs:sequence/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType abstract="true" name="abstractMap">
<xs:sequence/>
</xs:complexType>
<xs:complexType name="entry">
<xs:sequence>
<xs:choice minOccurs="0">
<xs:element name="byte" type="xs:byte"/>
<xs:element name="short" type="xs:short"/>
<xs:element name="int" type="xs:int"/>
<xs:element name="long" type="xs:long"/>
<xs:element name="float" type="xs:float"/>
<xs:element name="double" type="xs:double"/>
<xs:element name="char" type="xs:unsignedShort"/>
<xs:element name="boolean" type="xs:boolean"/>
<xs:element name="ByteWrapper" type="xs:byte"/>
<xs:element name="ShortWrapper" type="xs:short"/>
<xs:element name="IntegerWrapper" type="xs:int"/>
<xs:element name="LongWrapper" type="xs:long"/>
<xs:element name="FloatWrapper" type="xs:float"/>
<xs:element name="DoubleWrapper" type="xs:double"/>
<xs:element name="Character" type="xs:unsignedShort"/>
<xs:element name="BooleanWrapper" type="xs:boolean"/>
<xs:element name="BigDecimal" type="xs:decimal"/>
<xs:element name="String" type="xs:string"/>
<xs:element name="Date" type="xs:dateTime"/>
</xs:choice>
</xs:sequence>
<xs:attribute name="key" type="xs:string"/>
</xs:complexType>
ここで見つけた他の複数のケースを調べましたが、どれも私の問題を解決できませんでしたhttp://docs.oracle.com/javase/6/docs/api/javax/xml/bind/ Annotation/adapters/XmlAdapter.html ですが、Java への wsdl がスキーマを台無しにしているようです。
ありがとう。