我最近将REST API升级为使用jersey 2.x,现在我无法以以前的方式检索JSON主体参数,因此不再调用这些方法。我的猜测是我缺少将JSON解析为java对象的依赖项,但是我不太确定我需要添加什么,任何帮助都值得赞赏。
pom.xml
<dependencies> <dependency> <groupId>javax.ws.rs</groupId> <artifactId>javax.ws.rs-api</artifactId> <version>2.0.1</version> </dependency> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet</artifactId> <version>2.19</version> </dependency> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-server</artifactId> <version>2.19</version> </dependency> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-client</artifactId> <version>2.19</version> </dependency> <dependency> <groupId>com.googlecode.json-simple</groupId> <artifactId>json-simple</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-multipart</artifactId> <version>2.22</version> </dependency> </dependencies>
REST方式
@POST @Path("/users/{userId}/friends") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) public Response followUser(@PathParam("userId") Integer myUserId, FollowUserBean user) {}
FollowUserBean.java
import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class FollowUserBean { public Integer friendId; public FollowUserBean() {} }
在撰写本文时,Jersey 2.x与以下模块集成以提供JSON支持:
请参阅以下将Jackson用作Jersey 2.x的JSON提供程序所需的步骤:
添加Jackson模块依赖项
要将Jackson 2.x用作JSON提供程序,您需要jersey-media-json- jackson在pom.xml文件中添加模块:
jersey-media-json- jackson
<dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jackson</artifactId> <version>2.25.1</version> </dependency>
要使用Jackson 1.x,它将类似于:
<dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jackson1</artifactId> <version>2.25.1</version> </dependency>
注册Jackson模块
除了添加上述依赖之外,您还需要在/ 子类中注册JacksonFeature(或Jackson1Feature对于Jackson 1.x):ApplicationResourceConfig
JacksonFeature
Jackson1Feature
Application
ResourceConfig
@ApplicationPath("/api") public class MyApplication extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> classes = new HashSet<Class<?>>(); classes.add(JacksonFeature.class); return classes; } } @ApplicationPath("/api") public class MyApplication extends ResourceConfig { public MyApplication() { register(JacksonFeature.class); } }
如果没有Application/ ResourceConfig子类,则可以JacksonFeature在web.xml部署描述符中注册。可以在初始化参数的 逗号分隔值 中提供特定的资源,提供者和功能完全合格的类名称jersey.config.server.provider.classnames。
web.xml
jersey.config.server.provider.classnames
<init-param> <param-name>jersey.config.server.provider.classnames</param-name> <param-value>org.glassfish.jersey.jackson.JacksonFeature</param-value> </init-param>
在MessageBodyWriter杰克逊提供的是JacksonJsonProvider。
MessageBodyWriter
JacksonJsonProvider
有关更多详细信息,请参阅Jersey 文档中有关常见媒体类型表示形式的支持。