Web services 带有映射的JAXB错误
我有一个逻辑,它需要把所有的。我正在使用jaxws的metro实现。 我使用了Blaise的建议,它适用于对象数据为字符串的场景。对于我注意到的那些将列表作为数据的类,在网络的客户端,JAXB生成了自己的自定义ArrayList类,该类扩展了自定义AbstractList,如下所示:Web services 带有映射的JAXB错误,web-services,map,jaxb,Web Services,Map,Jaxb,我有一个逻辑,它需要把所有的。我正在使用jaxws的metro实现。 我使用了Blaise的建议,它适用于对象数据为字符串的场景。对于我注意到的那些将列表作为数据的类,在网络的客户端,JAXB生成了自己的自定义ArrayList类,该类扩展了自定义AbstractList,如下所示: @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "arrayList") @XmlSeeAlso({ CustomFieldMap.class }
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "arrayList")
@XmlSeeAlso({
CustomFieldMap.class
})
public class ArrayList
extends AbstractList
{
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "abstractList")
@XmlSeeAlso({
ArrayList.class
})
public abstract class AbstractList
extends AbstractCollection
{
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "abstractCollection")
@XmlSeeAlso({
AbstractList.class
})
public abstract class AbstractCollection {
}
我认为上面的内容有点奇怪,因为当客户端需要使用ArrayList数据时,如果它使用的是自定义ArrayList而不是java.util.ArrayList,则不会显示任何值
我的模型看起来是这样的:
@XmlSeeAlso( { CFMap.class, CField.class, ArrayList.class } )
public final class MAdapt
extends
XmlAdapter< CFMap, Map< String, Object >>
{
@Override
public CFMap marshal( Map< String, Object > pCField )
throws Exception
{
CFMap vCFMap = new CFMap();
// ignore custom fields having null values
if( pCField == null )
{
return vCFMap;
}
for( Entry< String, Object > vEntry : pCField.entrySet() )
{
CField vCField = new CField();
vCField.key = vEntry.getKey();
vCField.value = vEntry.getValue();
vCFMap.add( vCField );
}
return vCFMap;
}
@Override
public Map< String, Object > unmarshal( CFMap pCFMap )
throws Exception
{
HashMap< String, Object > vHashMap = new HashMap< String, Object >();
if( pCFMap == null )
{
return vHashMap;
}
pCFMap.forEach( p -> vHashMap.put( p.key, p.value ) );
return vHashMap;
}
}
@XmlRootElement
@XmlAccessorType( XmlAccessType.FIELD )
@XmlSeeAlso({CField.class, ArrayList.class})
public class CFMap extends ArrayList< CField >
{
private static final long serialVersionUID = 1L;
@XmlElement (name = "cField")
public List< CField > getCFields()
{
return this;
}
}
@XmlRootElement
@XmlSeeAlso( { MAdapt.class, CFMap.class, ArrayList.class } )
public class CField
{
@XmlElement( nillable = true )
public String key;
@XmlElement( nillable = true )
public Object value;
}
用法是:
@XmlRootElement
public class TestC
{
....
protected Map< String, Object > csFields;
@XmlElement( name = "cfields" )
@XmlJavaTypeAdapter( MAdapt.class )
public Map< String, Object > getCsFields()
{
return customFields;
}
}
我终于解开了这个谜 我修改了适配器,创建了一个子类来处理集合类型,如下所示:
@XmlType (name = "itemList")
public static class CType
{
@XmlElement (name = "item")
private Collection<?> items;
}
然后在数据封送过程中执行必要的健全性检查:
@Override
public CFMap marshal( Map< String, Object > pCField )
throws Exception
{
.....
for( Entry< String, Object > vEntry : pCField.entrySet() )
{
...
Object vTempV = vEntry.getValue();
if (vTempV instanceof Collection< ? >)
{
CType wrapper = new CType();
wrapper.collection = (Collection< ? >) vTempV;
vCustomField.value = wrapper;
}
else
{
vCustomField.value = vTempV;
}
vCFMap.add( vCField );
}
return vCFMap;
}