所以我最近从Jersey 1.x搬到了2.x,经过一系列问题后,最终得到了它。但每当我尝试访问返回JSONObject的资源时,我都会遇到问题。首先,这是我的示例方法:
@GET
@Path("/foobar")
@Produces(MediaType.APPLICATION_JSON)
public JSONObject print2() throws JSONException {
JSONObject jsonObject = new JSONObject();
jsonObject.put("hi", 22);
return jsonObject;
}
现在如果我将Jettison 1.3.8用于我的JSONObject,如果我尝试访问此资源,我会得到以下内容:
{"escapeForwardSlashAlways":true}
不确定那里发生了什么。然后我尝试了一些旧版本的Jettison和org.json,但这些给了我这个问题:
No serializer found for class org.json.JSONObject and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) )
在Jersey 1.x上,当这种方法适合我时,我不确定为什么会出现这些问题。
答案 0 :(得分:1)
假设您使用的是Servlet 3.0及更高版本,以下示例可帮助您设置环境以使用JSON数据:
依赖关系:如果您使用的是Maven,则需要以下依赖项:
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.23.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.23.2</version>
</dependency>
如果您不使用Maven,则需要将相应的jar添加到类路径中。
定义POJO以包含要序列化为JSON的数据,例如,
public class User {
private String username;
private String email;
// getters + setters
}
相应地修改您的资源方法:
@GET
@Path("/foobar")
@Produces(MediaType.APPLICATION_JSON)
public User print2() {
User jsonObject = new User();
jsonObject.setUsername("Me");
jsonObject.setEmail("my@email.com");
return jsonObject;
}
打包和部署,输出应为:
{ &#34;用户名&#34;:&#34;我&#34;, &#34;电子邮件&#34;:&#34; my@email.com" }
注意:此示例已部署并适用于Tomcat 8.5.5。
答案 1 :(得分:0)
另一种选择是允许Response将您的对象转换为JSON。这提供了添加HTTP代码的额外好处。因此,您可以返回400,404,500等,并仍然发送回JSON响应,您的JS可以采取行动。您应该能够将JSONObject放在那里,因为它基本上只是扩展Map - 或任何对象。
@GET
@Path("/foobar")
@Produces(MediaType.APPLICATION_JSON)
public Response print2() {
User jsonObject = new User();
jsonObject.setUsername("Me");
jsonObject.setEmail("my@email.com");
return Response.status(Response.Status.OK).entity(jsonObject).build());
}
答案 2 :(得分:0)
我正在努力解决同样的问题,最终Jersey's bookmark exmple帮助了。
问题是你的Jersey没有JSONObject
的序列化程序,而是尝试使用BeanSerializer。 Jettison JSONObject只有一个公共getter(isEscapeForwardSlashAlways
),而org.json.JSONObject
根本没有getter,因此BeanSerializer
无法应用。
解决方案适用于(jettison json对象):
<dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jettison</artifactId> <version>2.26</version> </dependency>
<init-param> <param-name>jersey.config.server.provider.classnames</param-name> <param-value>org.glassfish.jersey.jettison.JettisonFeature</param-value> <init-param>
@ApplicationPath("/") public class MyApplication extends ResourceConfig { public MyApplication() { registerClasses(UsersResource.class); register(new JettisonFeature()); } }
的web.xml:
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>org.glassfish.jersey.examples.bookmark.MyApplication</param-value>
</init-param>
也许org.json.JSONObject也有泽西的序列化功能,我不知道......