如何在jersey 2.x中传递json并获得json响应以及" escapeForwardSlashAlways":在球衣2.x和

时间:2017-05-16 14:43:13

标签: java rest jersey jackson jersey-2.0

我正在使用java中的jersey进行休息项目。球衣网站https://jersey.java.net/documentation/latest/user-guide.html无法查看球衣2.x的文档,所以我发布了这个问题,

我有一个使用球衣1.x的球衣项目。我有一个学生的POJO课程

public class Student
{
    private String rollno;

    private String name;

    public String getRollno() {
        return rollno;
    }

    public void setRollno(String rollno) {
        this.rollno = rollno;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

我有一个post方法的资源类,如下所示,

@POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Response createStudent(@Context HttpServletRequest request, @Context HttpServletResponse response, JSONObject jsonData) throws JSONException {
        // -- process data
        JSONObject json = new JSONObject();
        json.put("message", "created successful");
        return Response.status(Status.OK).entity(json).type(MediaType.APPLICATION_JSON).build();
    }

以下是jersey 1.x的web.xml条目,

<servlet>
        <servlet-name>Jersey</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>my.package</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

使用邮递员,我将输入数据提供给json,

{
  "rollno" : "STD01",
  "name" : "XXX"
}

以上设置适用于jersey 1.x,我能够收到创建成功的响应消息。现在我尝试将此项目迁移到jersey2.x并执行以下更改,

web.xml:

<servlet>
        <servlet-name>Jersey</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>my.package</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

pom.xml:(导入以下依赖项)

<dependency>
            <groupId>org.glassfish.jersey.bundles</groupId>
            <artifactId>jaxrs-ri</artifactId>
            <version>2.26-b03</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-jackson</artifactId>
            <version>2.26-b03</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-processing</artifactId>
            <version>2.26-b03</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-multipart</artifactId>
            <version>2.26-b03</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-sse</artifactId>
            <version>2.26-b03</version>
        </dependency>

现在我执行了同一个项目并得到了以下错误,

Unrecognized field "rollno" (class org.codehaus.jettison.json.JSONObject), not 
    marked as ignorable (one known property: "escapeForwardSlashAlways"])
     at [Source: org.glassfish.jersey.message.intrnal.ReaderInterceptorExecutor$UnCloseableInputStream@42512d97; line: 2, column: 15] (through reference chain: org.codehaus.jettison.json.JSONObject["rollno"])

所以我已经更改了POST资源类和POJO类的参数,如下所示,

Student.class

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonAutoDetect
public class Student
{
    private String rollno;

    private String name;

    public String getRollno() {
        return rollno;
    }

    public void setRollno(String rollno) {
        this.rollno = rollno;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

资源类:

 @POST
        @Consumes(MediaType.APPLICATION_JSON)
        @Produces(MediaType.APPLICATION_JSON)
        public Response createStudent(@Context HttpServletRequest request, @Context HttpServletResponse response, Student student) throws JSONException {
            // -- process data
            JSONObject json = new JSONObject();
            json.put("message", "created successful");
            return Response.status(Status.OK).entity(json).type(MediaType.APPLICATION_JSON).build();
        }

使用POJO类而不是JSONObject后,@ POST方法被命中,异常消失了。但我得到了回应

{
  "escapeForwardSlashAlways": true
}

如果我将返回类型更改为Student并设置值,我可以返回json。但我无法返回我为响应创建的jsonobject。

我的问题是为什么使用JSONObject在jersey 1.x上工作的项目在泽西2.x中不起作用?

我是否需要始终使用POJO类从客户端获取输入数据?

如何将自定义json作为响应而不是POJO返回?

请建议我。在此先感谢!!!

0 个答案:

没有答案