【问题标题】:Jersey 2.26 REST API - Json return not workingJersey 2.26 REST API - Json 返回不起作用
【发布时间】:2018-01-03 01:42:32
【问题描述】:

我有这个简单的示例以 JSON 格式返回用户列表。它适用于 XML,但不适用于 JSON。 不知道我做错了什么。还有什么我需要做的吗? 我使用 jersey-quickstart (maven) 创建了项目,并取消了对支持 JSON 的依赖项的注释。

<dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-binding</artifactId>
        </dependency>

在我的用户域中,我有 @XmlRootElement 注释,并且只有 2 个字段。 ID(长)和用户名(字符串)

这就是我的资源:

@GET
    @Produces(MediaType.APPLICATION_JSON)
    public List<User> getUsers(){
        return userService.getAllUsers();
    }

这就是我的服务:

public List<User> getAllUsers(){
        List<User> users = new ArrayList<User>();

        User u1 = new User(1l, "user_1");
        User u2 = new User(2l, "user_2");
        User u3 = new User(3l, "user_3");

        users.add(u1);
        users.add(u2);
        users.add(u3);

        return users;
    }

通过将 APPLICATION_JSON 更改为 APPLICATION_XML 可以正常工作并返回带有用户列表的 xml。使用 APPLICATION_JSON 我得到了这个:

SEVERE: MessageBodyWriter not found for media type=application/json, type=class java.util.ArrayList, genericType=java.util.List<com.wordpress.whiteboardcoding.agenda.domain.User>.

不确定除了取消注释 jersey-media-json-binding 之外是否还有其他事情要做。有什么想法吗?

试图找出是否有不同之处,因为它不再使用 jersey-media-moxy。

谢谢!

【问题讨论】:

    标签: java rest jaxb jackson jersey-2.0


    【解决方案1】:

    您不能将响应 JSON 定义为 List,因为 JAXB 无法通过 java.util.Listjava.util.ArrayList 类定义识别 @XmlRootElement

    所以,我建议将您的 User 列表包装起来。

    @XmlRootElement(name = "Users")
    public class Users {
    
        List<User> userList;
    
        //setters and getters goes here
    }
    
    @XmlRootElement()
    class User{
       //fields here
    }
    

    而且,您的服务将是

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Users getUsers(){
        Users users = new Users ();
        users.setAllUsers (userService.getAllUsers());
        return users;
    }
    

    另外,请确保您已添加所有具有相同版本的库。

    【讨论】:

    • 我不这么认为。即使我返回一个用户,我也会得到同样的错误。我尝试了您提到的方法,但仍然无法正常工作。我正在尝试这种方法:jersey.github.io/documentation/latest/media.html#json 并看到了这个例子:github.com/jersey/jersey/tree/2.26/examples/json-moxy 但后来我得到了这个错误:原因:java.lang.ClassNotFoundException:org.glassfish.jersey.moxy.json.MoxyJsonConfig at org.apache。 catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1275)
    • @Igor 你在用moxy吗??还是杰克逊??您不需要任何这些球衣将负责序列化和反序列化。
    • 因此,“jersey-quickstart-webapp”与此相关:jersey-media-json-binding,但它不起作用,所以我去了文档并决定使用 moxy。所以基本上我所看到的是我需要做的就是添加依赖项,仅此而已......但随后我收到此消息:SEVERE: MessageBodyWriter not found for media type=application/json.
    • @Igor 我建议只使用 jersey lib 并删除所有库。泽西岛会照顾好所有人
    • 那么我应该保留哪些库?如果我删除 moxy,我仍然会遇到同样的错误。问题是它适用于 APPLICATION_XML,所以一切似乎都运行良好。
    【解决方案2】:

    当前答案未解决 Jersey 快速入门项目中引用的 jersey-media-json-binding 工件(这似乎是所提出问题中原始问题的基础)。

    Jersey 网站没有明显提及 jersey-media-json-binding 依赖或其用法。我们所拥有的只是快速入门 pom 中的一个建议,即如果依赖关系得到解决,Json 支持将可用。

    据我所知,jersey-media-json-binding 是JSON-B(用于 JSON 绑定的新 Java API)的映射。

    我刚来到泽西岛,所以还不完全了解所有可用的 JSON 映射选项(例如 moxy、jaxb、json-p 等)以及它们与 JSON-B 绑定的关联,但我认为这可以解释困难伊戈尔遇到。

    与 JSON-B 相关的 JSON-P 也存在混淆的空间。一些进一步的依赖细节here

    更新

    我仍然对这一切感到非常困惑,但可以从 Cassio Mazzochi Molin 的回答中获得更多信息:Jersey 2 + Jackson Annotation / @JsonIgnore

    另一个更新

    我的建议是不要使用 jersey-media-json-binding。

    它使用 Yasson 1.0(从 Jersey 2.7 开始)来实现 json 功能。虽然 Yasson 是 JSON-B 的参考实现,但 1.0 版存在许多问题和限制。基于 GSON 或其他一些成熟的库注册自己的提供者要容易得多;在此处查看示例:https://howtodoinjava.com/jersey/jax-rs-gson-example/

    【讨论】:

      猜你喜欢
      • 2016-07-27
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      • 2013-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多