5

如果我传输具有 @XmlRoolElement 的类( MyClass ),此代码工作正常

客户

WebResource webResource = restClient.resource(getRessourceURL());
return webResource.get( new GenericType<List<MyClass>>(){} );

但是,如果我尝试传输一个原语,如字符串、整数、布尔值等......

客户

WebResource webResource = restClient.resource(getRessourceURL());
return webResource.get( new GenericType<List<Integer>>(){} );

我收到错误消息:

无法将类型“java.lang.Integer”编组为元素,因为它缺少 @XmlRootElement 注释

向我的请求发送实体参数时,我得到完全相同的结果:

客户

WebResource webResource = restClient.resource(getRessourceURL());
return webResource.post( new GenericType<List<Integer>>(){}, Arrays.toList("1"));

服务器

@GET
@Path("/PATH")
@Produces(MediaType.APPLICATION_JSON)
public List<MyClass> getListOfMyClass( List<Integer> myClassIdList)
{
  return getMyClassList(myClassIdList);
}

有没有办法在不为这些原始类型中的每一个创建包装类的情况下转移这种列表?还是我错过了一些明显的东西?

4

1 回答 1

1

我找到了一种解决方法,方法是手动控制 un-/marshalling,无需 Jersey。

客户

WebResource webResource = restClient.resource(getRessourceURL());
return webResource.post( new GenericType<List<Integer>>(){}, JAXBListPrimitiveUtils.listToJSONArray( Arrays.toList("1") ));

服务器

@GET
@Path("/PATH")
@Produces(MediaType.APPLICATION_JSON)
public List<MyClass> getListOfMyClass(JSONArray myClassIdList)
{
  return getMyClassList(JAXBListPrimitiveUtils.<Integer>JSONArrayToList(myClassIdList) );
}

我使用的 util 类:

import java.util.ArrayList;
import java.util.List;

import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONException;

public class JAXBListPrimitiveUtils
{

  @SuppressWarnings("unchecked")
  public static <T> List<T> JSONArrayToList(JSONArray array)
  {
    List<T> list = new ArrayList<T>();
    try
    {
      for (int i = 0; i < array.length(); i++)
      {
        list.add( (T)array.get(i) );
      }
    }
    catch (JSONException e)
    {
      java.util.logging.Logger.getLogger(JAXBListPrimitiveUtils.class.getName()).warning("JAXBListPrimitiveUtils :Problem while converting JSONArray to arrayList" + e.toString());
    }

    return list;
  }

  @SuppressWarnings("rawtypes")
  public static JSONArray listToJSONArray(List list)
  {
    return new JSONArray(list);
  }
}
于 2012-11-23T13:45:58.967 回答