我是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);
但仍然徒劳......
答案 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捕获了?