Java CometD发布/交付JSONObject并将其传输到POJO,但失败

Java CometD发布/交付JSONObject并将其传输到POJO,但失败,java,json,jsonobject,cometd,Java,Json,Jsonobject,Cometd,我是Comet的新手,我成功地构建了Comet,它通过Map传递值。但是,当我想用POJO传递值时(当然是用JSON的方式),就会出现问题 我现在从客户机发布JSONObject,服务器将直接返回数据,因此客户机将接收它发布的数据: 要发布的POJO(只需包含2个元素和相应的getter/setter的POJO): public class TestObject { int pxid; boolean isInService; public TestObject() { } publi

我是Comet的新手,我成功地构建了Comet,它通过
Map
传递值。但是,当我想用POJO传递值时(当然是用JSON的方式),就会出现问题

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

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

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());

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

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());

    }
}
它工作正常,直到客户端接收到它传递给服务器的数据。 在
NodeLsnr
内部类的
onMessage
方法中,它会打印
JSONstr
如下:

接收JSON:{“数据”:{“isInService”:false,“pxid”:5},“通道”:“/echo”}

但是,当我想用这行代码将JSON字符串传输到JSONObject时,它被卡住了:

JSONObject jsonObj=JSONObject.fromObject(JSONstr)

当我说“卡住”时,我的意思是没有例外,也没有打印jsonObj(正如我所希望的那样),相反,它什么也没有发生。
有什么想法吗?提前谢谢

另外,我确实研究过Comet like的官方网站,但我不能很好地理解它。
如果我的方法不合理,正确/建议的方法是什么


使现代化 而不是

JSONObject jsonObj=JSONObject.fromObject(JSONstr)

,我也试过了

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


但是仍然是徒劳的…

我找到了解决方案,就在我摆脱Comed并简单地将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使用了一个不同的包,如前所述:

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


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

p.s.我使用的是net.sf.json.JSONObject