使用Atmosphere返回JSONP序列化对象

时间:2012-01-20 11:52:01

标签: java jersey comet atmosphere

我想在我的一个项目中使用Atmosphere,并且在使用它来将简单的POJO-s序列化为JSONP时遇到一些问题。我不理解@Produces注释与我之前在一个简单的RESTful服务中序列化我的POJO-s之前成功使用的必要com.sun.jersey.api.json.JSONWithPadding对象之间的关系。

这是我的暂停方法:

@GET
  @Path("/notification")
  @Produces( { "application/x-javascript", MediaType.APPLICATION_JSON })
  @Suspend
  public JSONWithPadding getNextNotification(
    @QueryParam("callback") @DefaultValue("callback") String callback) {
    Random random = new Random();
    Notification n = new Notification();
    n.setMessage("Message is " + Long.toHexString(random.nextLong()));
    n.setMessage("S-" + Long.toHexString(random.nextLong()));
    return new JSONWithPadding(n, callback);
  }

这会按预期将适当的JSON字符串返回给我。这就是问题所在。我有广播方法返回:

@Broadcast({XSSHtmlFilter.class, JsonpFilter.class})
  @GET
  @Path("/broadcast2")
  public Notification broadcast2() {
    Random random = new Random();
    Notification n = new Notification();
    n.setMessage("Message is " + Long.toHexString(random.nextLong()));
    n.setMessage("S-" + Long.toHexString(random.nextLong()));
    return n;
  }

这会产生以下异常:

Caused by: com.sun.jersey.api.MessageException: A message body writer for Java class com.ericsson.nss.entities.Notificaion, and Java type class com.ericsson.nss.entities.Notification, and MIME media type application/octet-stream was not fund

似乎框架想要序列化Notification对象但是无法这样做。 JsonpFilter似乎无所事事。我不确定这个方法是否应该返回Notification或JSONWithPadding包装对象。如果我从@Broadcast注释中删除过滤器,则挂起方法会发出“com.ericsson.nss.entities.Notification@308be6”字符串。这比异常更好,但仍然不是JSONP消息。不幸的是,从maven repo构建的最新休闲聊天演示没有运行(其他人提到404 / chat)。

如果我的广播方法返回JSONWithPadding实例并且过滤器关闭,则广播请求获得有效的JSONP响应,但被挂起的线程再次返回com.ericsson.nss.entities.Notification@7f84c9。

您能告诉我如何正确使用过滤器和注释吗?

(我正在使用最新的0.9版Atmosphere)

1 个答案:

答案 0 :(得分:0)

我只能通过从我的方法返回String个实例并使用Jackson手动处理JSONP序列化来实现它。