【问题标题】:Restlet Client Receiving Array of LinkedHashMap Elements Instead of Array of Object ElementsRestlet 客户端接收 LinkedHashMap 元素数组而不是对象元素数组
【发布时间】:2013-02-06 00:41:40
【问题描述】:

阿罗哈。

我有一个带有 @Get 方法的 Restlet 服务器应用程序,它应该返回 Object[],但客户端收到一个带有 LinkedHashMap 类型元素的 Object[]。每个接收到的数组元素对应于服务器应该发送的对象的各个元素。

这是我的资源(接口)文件的相关部分:

@Get
public Object[] retrieve() ;

这是我的服务器资源文件的相关部分:

public Object[] retrieve()
{

  User newUser = new User() ;
  newUser.firstName = "John" ;
  newUser.lastName = "Doe" ;

  Object[] objectArray = (Object[]) Array.newInstance( User.class, 1 ) ;
  objectArray[0] = newUser ;

  return objectArray ;

}

这是我客户的相关部分:

public static void main( String[] args ) throws Exception
{
  Object[] arrayOfObjects = (Object[]) clientResource.retrieve() ;   //  array of LinkedHashMap elements
}

我假设获得我想要获得的结果很容易,但我对 Restlet 框架还是很陌生。因此,有人能告诉我我做错了什么,并向我展示如何从服务器正确发送(JSON 编码)对象数组的示例吗?

谢谢,提前。

保重,
达尔文

================================================ ====================================

更新

根据 StaxMan 的评论(如下),我也尝试返回一个通用列表,但这只会导致 LinkedHashMap 元素的 ArrayList,而不是所需元素类型的 ArrayList。

这是我的资源(接口)文件的相关部分:

@Get
public <T> List<T> retrieve() ;

这是我的服务器资源文件的相关部分:

public <T> List<T> retrieve()
{
  List<T> list = ... ;
  return list ;
}

这是我客户的相关部分:

//  the following does not work, since the returned ArrayList's
//  elements are not User objects but LinkedHashMap objects:
User[] users = (User[]) ((ArrayList<User>)clientResource.<User>retrieve()).toArray( (User[])Array.newInstance(User.class,0) ) ;

谁能告诉我如何从服务器获取我想要的对象的数组或列表或数组列表,同时仍保持服务器的通用(甚至伪通用)性质?

谢谢,提前。

【问题讨论】:

  • 你不能使用像'T'这样的类型变量。那不是一个类型,那只是一个占位符。您必须传递一个真实类型,例如 User[].class 用于 User 对象数组;类型变量不会这样做,因为它仅由编译器使用,在运行时不保留。

标签: json object jackson restlet


【解决方案1】:

这是因为 Listjava.lang.Object - 您要求对象列表并且您正在获得。如果没有额外的类型信息,这几乎是你所能得到的。在您的情况下,您应该返回User[](或List&lt;User&gt;

【讨论】:

  • 感谢您的回复。我实际上是在尝试返回对象的伪泛型数组(或 List 或 ArrayList 或其他),因为 Restlet 似乎还不能返回实际的泛型数组(或 List 或 ArrayList 或其他)。因此,我试图妥协。无论如何,我对您建议的更改进行了类似的更改,但使用了泛型(不是具体的 List 元素类型),它现在返回 LinkedHashMap 元素的 ArrayList。我会将详细信息发布到上面的原始问题...
  • 好的。在这种情况下,您需要启用多态类型支持,以便反序列化器知道运行时类型,因为它不能从您传递的信息中获得。如果你有通用的超类型值(T extends MyBaseType),你可以使用@JsonTypeInfo。但如果没有,可能需要启用所谓的“默认类型”。这是通过ObjectMapper.enableDefaultTyping(...) 完成的。无论哪种方式,Jackson 都会在序列化中包含类型信息,并将其用于反序列化为实际类型。
  • 谢谢,StaxMan。您能否提供一个简单、可行的示例来说明您的建议?
  • 我觉得你需要问一下Restlet list:我不知道client.retrieve()预计会返回什么。
  • StaxMan,client.retrieve() 只是我服务器的@GET 方法...您是否碰巧有您提到的 T extends MyBaseType 等方法的示例?
猜你喜欢
  • 1970-01-01
  • 2017-12-11
  • 1970-01-01
  • 2020-10-21
  • 2014-06-10
  • 2021-01-01
  • 2013-09-12
  • 2021-08-14
  • 1970-01-01
相关资源
最近更新 更多