Web services 带有映射的JAXB错误

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 }

我有一个逻辑,它需要把所有的。我正在使用jaxws的metro实现。 我使用了Blaise的建议,它适用于对象数据为字符串的场景。对于我注意到的那些将列表作为数据的类,在网络的客户端,JAXB生成了自己的自定义ArrayList类,该类扩展了自定义AbstractList,如下所示:

@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;
}