CometD-发布/发送JSONObject并将其传输到POJO但卡住了

时间:2014-03-28 01:59:17

标签: java json jsonobject cometd

我是CometD的新手,我成功构建了它,并使用Map<String, Object>传递了值。但是,当我想用​​POJO传递值(当然是以JSON方式)时,会出现问题。

我现在从客户端发布JSONObject,服务器将直接传回数据,因此客户端将收到它发布的数据:

要发布的POJO (只需POJO,包含2个元素和相应的getter / setter)

public class TestObject {

int pxid;
boolean isInService;  

public TestObject() {
}

public TestObject(int pxid, boolean isInService) {
    this.pxid = pxid;
    this.isInService = isInService;
}
//getters and setters below...
}

在服务器端(只需将数据传回客户端)

public EchoService(BayeuxServer bayeuxServer) {
    super(bayeuxServer, "echo");
    addService("/echo", "processEcho"); 
}

public void processEcho(ServerSession remote, Map<String, Object> data) {
    System.out.println("in PROCESSECHO"+data.toString());
    remote.deliver(getServerSession(), "/echo", data, null);
}

在客户端:

public void createObjAndSend(){        
    TestObject newPX1 = new TestObject(5, false);        
    JSONObject pxJsonObj=JSONObject.fromObject(newPX1);
    sendMsgInJson(pxJsonObj,NODE_CHANNEL);
}

private void sendMsgInJson(JSONObject jsonObj, String channel) {
    ClientSessionChannel nodeChannel = client.getChannel(channel);
    nodeChannel.publish(jsonObj, new ClientSessionChannel.MessageListener() {
        @Override
        public void onMessage(ClientSessionChannel csc, Message msg) {
            if (!msg.isSuccessful()) {
                System.out.println("not published ok.");
            } else {
                System.out.println("published ok");
            }
        }
    });
}

private class NodeLsnr implements ClientSessionChannel.MessageListener {

    @Override
    public void onMessage(ClientSessionChannel csc, Message msg) {

        String JSONstr = msg.getJSON();
        System.out.println("Receive JSON:"+JSONstr);
        JSONObject jsonObj =  JSONObject.fromObject(JSONstr);
        System.out.println("jsonObj:" +jsonObj.toString());

    }
}

在客户端收到传递给Server的数据之前,它可以正常工作。 在onMessage内部类的方法NodeLsnr中,它会打印JSONstr,如:

  

接收JSON:{&#34;数据&#34;:{&#34; isInService&#34;:false,&#34; pxid&#34;:5},&#34;频道&#34 ;:&#34; /回波&#34;}

但是,当我想用​​这一行将JSON字符串传递给JSONObject时,它会被卡住:

  

JSONObject jsonObj = JSONObject.fromObject(JSONstr);

当我说&#34;卡住&#34;时,我的意思是没有例外,也没有jsonObj打印(如我所愿),相反,它什么也没发生。
有什么想法吗?提前谢谢。

P.S。我不像this那样研究CometD的官方网站,但我不能很好地理解它。
如果我的方法没有意义,那么正确/建议的方式是什么?


更新

而不是

  

JSONObject jsonObj = JSONObject.fromObject(JSONstr);

,我也试过

  

JSONObject jsonObj =(JSONObject)JSONSerializer.toJSON(JSONstr);

但仍然徒劳......

1 个答案:

答案 0 :(得分:0)

我找到了解决方案,就在我摆脱cometd并简单地将JSON字符串传递给JSONObject时,它会抛出异常。

事实证明我导入的库commons-lang-1.0.1.jar太旧了 导入commons-lang-2.6.jar并删除commons-lang-1.0.1.jar后,一切都很好。

请注意,虽然我之前已导入commons-lang3-3.0.1.jar,但它仍然无法正常工作。我认为这是因为3.0之后的comman-lang使用了不同的包,Apache Commons说:

  

请注意,Lang 3.0(及后续版本)使用与以前版本(org.apache.commons.lang)不同的包(org.apache.commons.lang3),允许它同时用作早期版本。

然而,奇怪的是它在与cometd集成时没有抛出任何异常,也许它被glassfish捕获了?