想报复一个人方法如下:CometD 2 JSON 库插件能力

来源:百度文库 编辑:中财网 时间:2024/05/02 01:14:24

原文地址:

                http://cometd.org/documentation/2.x/cometd-java/json

 

 

CometD 2 JSON 库插件能力

 

由 sbordet 提交于星期二,2011/8/16-9:11。

 

CometD 2 JSON 库插件能力

 

自版本 2.4.0开始,CometD 允许自定义JSON 库,用于把传入 JSON 转换成Bayeux 消息以及用 Bayeux 消息生成 JSON 。

 

这里有两种实现方法,一种是利用jetty的org.eclipse.jetty.util.ajax.JSON类,一种是Jackson库。默认的方法是利用jetty库。

 

这两个库几乎一样快,但也有区别,在特殊CometD情况下,jetty的库解析要比jackson快,但生成要比它慢。

 

Jackson库有丰富的API去自定义json且它是用注解的方式解析,所以如果你想用自定义的类作为bayeux消息的数据(代替java.util.Map对象),它将会很有优势。请阅读jackson的文档获取详细信息。

 

Jetty库也允许插入自定义的序列化和反序列化,也行太简单但不失为重新的方法(你想自定义类必须实现jetty库的接口)。请阅读org.eclipse.jetty.util.ajax.JSON的文档获取详细信息。

 

CometD json上下文 API

 

Json库在CometD java客户端实现中被用来生成json和把json解析成org.cometd.bayeux.Message实例。

 

执行生成/解析的json类的客户端必须实现org.cometd.common.JSONContext.Client

 

类似的,在服务端,一个org.cometd.common.JSONContext.Server的实现产生json或把json解析成org.cometd.bayeux.server.ServerMessage实例。

 

客户端配置

 

在客户端,org.cometd.common.JSONContext.Client实例必须直接传到配置的传输中,如果省略,默认使用jetty库。

 

例如:

 

 

 

 

 

HttpClient httpClient = ...;

 

Map clientOptions = new HashMap();

 

// Use the Jackson implementation

JSONContext.Client jsonContext = newJacksonJSONContextClient();

clientOptions.put(ClientTransport.JSON_CONTEXT, jsonContext);

 

ClientTransport transport = new LongPollingTransport(clientOptions,httpClient);

 

BayeuxClient client = new BayeuxClient(cometdURL, transport);

 

 

org.cometd.common.JSONContext.Client必须被所有的客户端传输共享(因为唯一的传输必须在任何时候都要被使用)。

 

你可以自定义json实现并添加你自己序列化和反序列化方法,例如:

 

public class MyJacksonJSONContextClient extends org.cometd.common.JacksonJSONContextClient
{
    public MyJacksonJSONContextClient()
    {
        org.codehaus.jackson.map.ObjectMapper objectMapper = getObjectMapper();
        objectMapper.registerModule(new MyModule());
    }
 
    private class MyModule extends org.codehaus.jackson.map.module.SimpleModule
    {
        public MyModule()
        {
            // Add your custom serializers/deserializers here
            addSerializer(Foo.class, new FooSerializer());
        }
    }
}

 

 

 

 

服务端配置

 

 

在服务端,实现org.cometd.common.JSONContext.Server的类可能在CometdServlet的初始化参数中指定了,如果省略,默认使用jetty库。

 

 

例如:

 

         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">
 
    
        cometd
        org.cometd.server.CometdServlet
        ... other parameters
        
            jsonContext
            org.cometd.server.JacksonJSONContextServer
        
    
    
        cometd
        /cometd/*
    
 

 

这个类必须被默认的初始化参数构造器实例化并实现org.cometd.common.JSONContext.Server,

以及它可以用添加序列化和反序列化的扩展来自定义。

 

 

 

 

可移植性注意事项

 

它能够从一个json的实现库转换成另一个json库,例如从jetty库换成jackson库,提供如此功能,应用程序的代码编写要特别小心。

 

从1.8.4版本开始,jackson当序列化json数组时只能提供java.util.List的实例。

但是jetty库在序列化json数组能提供Object[]。

类似的,jackson能提供lava.lang.Integer,而jetty库能提供java.lang.Long。

 

为了编写可移植的应用程序代码,我们使用下面的代码模式:

 

Message message = ...;
Map data = message.getDataAsMap();
 
// Expecting a JSON array
 
// WRONG
Object[] array = (Object[])data.get("array");
 
// CORRECT
Object field = data.get("array");
Object[] array = field instanceof List ? ((List)field).toArray() : (Object[])field;
 
 
// Expecting a long
 
// WRONG
long value = (Long)data.get("value");
 
// CORRECT
long value = ((Number)data.get("value")).longValue();