REST GET列表为JSON

时间:2016-07-31 16:44:30

标签: java json rest jersey

我有一个id列表,我需要将其作为参数传递,以JSON格式显示。具体来说,我将值放在List中,并希望我的GET方法将它们返回为:

[ 1, 5, 12,...]

我尝试使用GenericList,但是我收到了MessageBodyWriter错误:

MessageBodyWriter not found for media type=application/json, type=class java.util.ArrayList, genericType=java.util.List<java.lang.Long>.

我正在使用Jersey 2.16,我输出自定义类列表没有问题。代码在这里:

@GET
@Path("{name}")
@Produces(MediaType.APPLICATION_JSON)
public Response getUsersByName(@PathParam("name") String name){
    List<Long> userIds = userService.getUserssByName(name);
    GenericEntity<List<Long>> list = new GenericEntity<List<Long>>(userIds){};
    return Response.ok(list).build();
}

UserService查询名称与特定名称匹配的所有用户的哈希映射,并返回其键列表:

public List<Long> getUserssByName(String name){
    List<Long> ids = new ArrayList<>();

    for (Entry<Long, User> entry : users.entrySet()){
        User user = entry.getValue();
        if (user.getName().equals(name)){
            ids.add(entry.getKey());
        }
    }

    return ids;
}

如何按上述说明显示该列表?

2 个答案:

答案 0 :(得分:1)

我认为这个解释 - 答案将比仅仅修复&#34;更好。你的代码

默认情况下,jersey提供一组可用于给定媒体类型的实体提供程序。对于application/json,默认情况下会提供以下类型:

byte[]
String
InputStream
Reader
File
DataSource
StreamingOutput

要将对其他类型的序列化添加到json的支持,使用您当前使用的工具有点不稳定。我会解释......

Jersey只是一个用java开发RESTful Web服务的框架。曾经有一段时间没有REST存在(或者没有被认为是有用的),在此概念出现之前,已经有许多具体实现来促进Http数据传输。 JAX-RS就是其中之一。这是在javascript可能处于起步阶段并且XML在很大程度上统治万维网的时候。 JAX-RS的设计本身并不能防止类型擦除,而类型擦除正是我们想要实现的目标。对于我来说,在MessageBodyWriter中实现行为的极其冗长的解决方案将重新发明轮子,没有人喜欢重新发明轮子!但是,如果您有兴趣编写自己的实体,或者您有兴趣了解实体是什么以及如何自定义实体,请转到https://jersey.java.net/documentation/latest/message-body-workers.html。阅读本文档将概述您的问题究竟发生了什么。

解决方案

选择一项服务。学习它,不要重新发明轮子。有很多服务可以实现这一目标。我最喜欢的工具是Gson。它是由Google开发的Java库,用于将Java对象转换为JSON表示,反之亦然。

想知道修复代码有多简单吗?

@GET
@Path("{name}")
@Produces(MediaType.APPLICATION_JSON)
public Response getUsersByName(@PathParam("name") String name){
    List<Long> userIds = userService.getUserssByName(namee);
    Type listType = new TypeToken<List<Long>>() {}.getType();
    Gson gson = new Gson();
    String userIdList = gson.toJson(userIds, listType);
    return Response.ok(userIdList).build();
}

现在,jersey支持string / json用于String实体响应。几乎所有的响应都将表示为字符串,类型擦除被阻止,您将成为一个更开心的开发人员。

希望这有帮助!

答案 1 :(得分:0)

您必须将列表转换为数组。

@GET
@Path("{name}")
@Produces(MediaType.APPLICATION_JSON)
public Response getUsersByName(@PathParam("name") String name){
    List<Long> userIds = userService.getUserssByName(namee);
    Long[] userIdArray = userIds.toArray();
    return Response.ok(userIdArray).build();
}