java - REST GET 列表为 JSON

标签 java json rest jersey

我有一个 id 列表,需要将其作为参数传递以以 JSON 格式显示。具体来说,我将值放入列表中,并希望我的 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 查询 HashMap 以查找名称与特定名称匹配的所有用户,并返回其键列表:

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

如何按照我上面所述显示该列表?

最佳答案

我认为这个解释答案比仅仅“修复”你的代码更好

默认情况下,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 支持 application/json 进行字符串实体响应。几乎您所有的响应都将表示为字符串,防止类型删除,您将成为一名更快乐的开发人员。

希望这有帮助!

关于java - REST GET 列表为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38686240/

相关文章:

java - Java打印BufferedImage时出现空白页

ios - 数据未从 JSON Swift 获取

rest - 对 HTTP header 使用百分比编码是否合适或有必要?

java - 如何让Spring Security在身份验证成功后调用所请求的资源?

java - 处理与 Java.io 编码不同的输出编码?

java - 重新写入java txt文件

java - 并行无限循环

python - 为什么 JSONDecoder 会直观地将 json String 反序列化为 Python Objects?

javascript - 在附加 HTML 时执行 IF 语句的多个实例的更好方法?

reactjs - GraphQl 和条件解析器 API 请求