小编典典

在Java REST中解析JSON参数时出错

json

我最近将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() {}
}

阅读 280

收藏
2020-07-27

共1个答案

小编典典

您需要一个JSON提供程序

在撰写本文时,Jersey 2.x与以下模块集成以提供JSON支持:

使用杰克逊

请参阅以下将Jackson用作Jersey 2.x的JSON提供程序所需的步骤:

添加Jackson模块依赖项

要将Jackson 2.x用作JSON提供程序,您需要jersey-media-json- jacksonpom.xml文件中添加模块:

<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

@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子类,则可以JacksonFeatureweb.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


有关更多详细信息,请参阅Jersey
文档中有关常见媒体类型表示形式的支持。

2020-07-27