我正在使用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返回?
请建议我。在此先感谢!!!