我正在尝试使用 Jersey 创建一个非常简单的 REST 服务。这是服务代码
@Path("/UserService")
public class UserService {
@GET
@Path("/users")
@Produces(MediaType.APPLICATION_XML)
public List<User> getUsers() {
User user = new User(1, "Thomas", "Greene");
List<User> userList = new ArrayList<User>();
userList.add(user);
return userList;
}
}
当我通过 Postman 运行它时,它会返回一个 XML 响应
现在,我想获取 JSON 响应。所以,我将媒体类型更改为
application/json
:
@Path("/UserService")
public class UserService {
@GET
@Path("/users")
@Produces(MediaType.APPLICATION_JSON)
public List<User> getUsers(){
User user = new User(1, "Thomas", "Greene");
List<User> userList = new ArrayList<User>();
userList.add(user);
return userList;
}
}
它在 Tomcat 日志中给出以下错误:
严重:找不到 Media type=application/json、type=class java.util.ArrayList、genericType=java.util.List 的 MessageBodyWriter。
有人可以指导我如何获取 JSON 响应吗?
要使用 Jackson 2.x 作为 JSON 提供程序,您需要将
jersey-media-json-jackson
模块添加到您的 pom.xml
文件中:
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.22.2</version>
</dependency>
JacksonFeature
/Application
子类中注册 ResourceConfig
。
有关更多详细信息,请查看 Jersey 文档。
我现在对 JAXB 绑定也有点不安,因此让我在这里总结一下我的发现 - 如果我说了什么愚蠢的话,请纠正我:
我希望这对其他人有帮助。
您的类路径上需要一个 json 序列化器才能完成这项工作。
只需添加 Jackson,Jersey 就会在 writer 中使用它。 例如。如果您使用maven,请将其添加到pom.xml
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.7.4</version>
</dependency>
您的 xml 正在运行,所以我假设您的
@XmlRootElement
类中有 User
注释。
问题是,它知道如何使用注释
@XmlRootElement
将其转换为 xml,但不知道如何将其转换为 JSON。
因此,为了使其使用相同的 xml 注释(即
@XmlRootElement
)将所有内容转换为 JSON,我们可以添加
jersey-media-moxy-<whatever version>.jar
或者对于 Maven 用户
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
</dependency>
它还应该有一个无参数的构造函数
我尝试了大量这些依赖项,但它们都不适用于我的 Jersey3 版本。我需要做的是将 Arraylist 转换为实际的数组。我用
toArray()
管理了这个,它开始正确序列化!
真正的问题是你需要将列表放入类中,试试这个:
public class UserListClass() {
private List<User> userList = new ArrayList<User>();
public List<User> getUserList() { return userList; }
public setUserList(List<User> userList) { this.userList = userList; }
}
你的代码是这样的:
@Path("/UserService")
public class UserService {
@GET
@Path("/users")
@Produces(MediaType.APPLICATION_XML)
public UserListClass getUsers() {
User user = new User(1, "Thomas", "Greene");
List<User> userList = new ArrayList<User>();
userList.add(user);
UserListClass ulc = new UserListClass();
ulc.setUserList(userList);
return ulc;
}
}