泽西岛 2.26 REST API - Json return 不工作

Jersey 2.26 REST API - Json return not working

我有这个简单的示例 return 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 它工作正常,并且 return 将 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。

谢谢!

您不能将响应 JSON 定义为列表,因为 JAXB 无法识别 java.util.Listjava.util.ArrayList class 定义中的 @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 快速启动项目中引用的 jersey-media-json-binding 工件(这似乎是所提出问题中原始问题的基础)。

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

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

我刚来泽西岛,所以还没有完全理解所有可用的 JSON 映射选项(例如 moxy、jaxb、json-p 等)及其与 JSON-B 绑定,但我认为这可以解释 Igor 遇到的困难。

JSON-P 与 JSON-B 之间也存在混淆的余地。一些进一步的依赖细节 here.

更新

我仍然对所有这些感到非常困惑,但可以从 Cassio Mazzochi Molin 的回答中获得更多信息:

另一项更新

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

它使用 Yasson 1.0(截至 Jersey 2.7)来实现 json 功能。虽然 Yasson 是 JSON-B 的参考实现,但是 ver 1.0 有很多问题和局限性。基于 GSON 或其他一些成熟的库注册自己的提供者要容易得多;请参阅此处的示例:https://howtodoinjava.com/jersey/jax-rs-gson-example/