Resteasy将List转换为LinkedHashMap

5
我正在使用RestEasy在一些RESTful Web服务之间发送键/值对。
要发布这些对的列表,我使用以下代码片段:
List<Pair> pairs = new ArrayList<>();
pairs.add(new Pair("name", "Arnold"));
pairs.add(new Pair("age", "20"));

ResteasyClient resteasyClient = getClient();
ResteasyWebTarget target = resteasyClient.target(targetURI);
Invocation.Builder request = target.request();
request.post(Entity.entity(entity, MediaType.APPLICATION_JSON_TYPE));

“Pair”只是一个未注释的类。
public String key,
public String value 
default constructor 
(key,value) constructor

目标资源可以通过以下方式接收到此信息:
 @POST
 @Path("/metadata")
 @Consumes(MediaType.APPLICATION_JSON)
 public Response postMetadata(List<Pair> properties) {...

jax-rs资源可以正确读取List。
现在另一种方式有问题:
检索资源被定义为:
@GET
@Path("/getUrl.../{id}")
@Produces(MediaType.APPLICATION_JSON)
public Response getMetadata(@PathParam("id") String id) {
data_from_hibernate = em.find(id);
...
List<Pair> properties = new ArrayList<>();
//fill List from data
return Response.ok().entity(properties).build();

客户端是:
Response response = request.get("http://getUrl.../"+id);
List<Pair> properties = response.readEntity(List.class);

logger.info("got properties != null? " +(properties!=null));
logger.info("size: "+properties.size());
logger.info("[0]" + properties.get(0));
logger.info("type: "+properties.get(0).getClass().getName());

列表不为空;
大小正确;
get(0) 输出的格式很奇怪:[0]{"name": "value"};
接下来是奇怪格式出现的原因:异常告诉我:
java.util.LinkedHashMap 无法转换为 Pair。
此时,properties 怎么会成为 LinkedHashMap,或者说是一个包含 LinkedHashMap 的列表?
1个回答

5

如果没有类型信息(当您使用readEntity时),Jackson(底层反序列化器)将把任意JSON对象转换为LinkedHashMap

使用readEntity时,您可以通过使用GenericType来提供通用类型信息。

List<Pair> properties = response.readEntity(new GenericType<List<Pair>>(){});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接