我正在尝试使用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响应。所以,我将mediatype改为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日志中给出了以下错误:
SEVERE:找不到媒体类型= application / json的MessageBodyWriter,type = class java.util.ArrayList,genericType = java.util.List。
有人可以指导我如何获得JSON回复吗?
答案 0 :(得分:9)
要将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
。
有关详细信息,请查看泽西岛documentation。
答案 1 :(得分:2)
我现在对JAXB绑定感到有点不高兴,所以让我在这里总结一下我的发现 - 如果我说些愚蠢的话,请纠正我:
我希望这有助于其他人。
答案 2 :(得分:1)
您需要在类路径上使用json序列化程序才能使其正常工作。
只需添加杰克逊和泽西将在作家中使用此功能。 例如。如果您使用的是maven,请将其添加到pom.xml
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.7.4</version>
</dependency>
答案 3 :(得分:0)
您的xml正在运行,因此我假设您的@XmlRootElement
课程中有User
个注释。
问题是,它知道如何使用注释@XmlRootElement
将其转换为xml,但它不知道如何将其转换为JSON。
因此,为了使所有内容都转换为具有相同xml注释的JSON(即@XmlRootElement
),我们可以添加
jersey-media-moxy-<whatever version>.jar
或为maven用户
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
</dependency>
它也应该有一个无参数构造函数
答案 4 :(得分:0)
我尝试了大量这些依赖项,但没有一个适用于我的 Jersey3 版本。我需要做的是将 Arraylist 变成一个实际的数组。我使用 toArray()
进行了管理,它开始正确序列化!