我有这个简单的例子来返回JSON中的User列表。它适用于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了。
谢谢!
答案 0 :(得分:1)
您无法将回复JSON
定义为列表,因为JAXB无法识别@XmlRootElement
或java.util.List
类定义上的java.util.ArrayList
。
所以,我建议打包你的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;
}
另外,请确保您已添加所有具有相同版本的库。
答案 1 :(得分:1)
目前的答案并没有解决Jersey快速启动项目中引用的jersey-media-json绑定工件(这似乎是提出问题中原始问题的基础)。
Jersey网站没有明确提及jersey-media-json-binding依赖关系或其用法。我们所拥有的只是快速入门pom中的一个建议,即如果依赖性得到解决,Json支持将可用。
据我所知,jersey-media-json-binding是JSON-B(用于JSON绑定的新Java API)的映射。
我来到Jersey新鲜,所以还没有完全理解所有可用的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的参考实现,但ver 1.0存在许多问题和限制。基于GSON或其他一些成熟的库注册您自己的提供者要容易得多;请参阅此处的示例:https://howtodoinjava.com/jersey/jax-rs-gson-example/