Java CometD发布/交付JSONObject并将其传输到POJO,但失败
我是Comet的新手,我成功地构建了Comet,它通过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
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