dubbox REST服务使用fastjson替换jackson

简介: 上一节讲解了resteasy如何使用fastjson来替换默认的jackson,虽然dubbox内部采用的就是resteasy,但是大多数情况下,dubbox服务是一个独立的app,并不需要以war包形式部署在外置容器中,也就没有web.xml。
上一节讲解了resteasy如何使用fastjson来替换默认的jackson,虽然dubbox内部采用的就是resteasy,但是大多数情况下,dubbox服务是一个独立的app,并不需要以war包形式部署在外置容器中,也就没有web.xml。好在dubbox扩展性不错,很容易扩展,有此类需求的可以参考下面的做法:
 
一、rest协议指定fastjson做为序列化
 <dubbo:protocol name="rest" port="8080"  server="tomcat" contextpath="/" serialization="fastjson" charset="GBK"/>
注意这里的:serialization="fastjson" charset="GBK" 这里指定了采用fastjson作为json序列化的框架,同时字符编码格式为GBK。
 
二、修改BaseRestServer源码
dubbo采用了"URL总线"设计思想,所有服务的信息,最终都拼成一个URL注册到zk中, com.alibaba.dubbo.rpc.protocol.rest.BaseRestServer的start方法里,可以拿到这些URL的信息,参考以下代码:
public void start(URL url) {
        getDeployment().getMediaTypeMappings().put("json", "application/json");
        getDeployment().getMediaTypeMappings().put("xml", "text/xml");
        getDeployment().getProviderClasses().add(RpcContextFilter.class.getName());

        //增加对serialization、charset的解析 杨俊明 2017-04-26
        String serialization = url.getParameter("serialization");
        if (StringUtils.isNotEmpty(serialization)) {
            String charset = url.getParameter("charset", "UTF-8");
            if (serialization.equals("fastjson")) {
                getDeployment().setRegisterBuiltin(false);
                getDeployment().getScannedProviderClasses().clear();
                FastJsonConfig fastJsonConfig = new FastJsonConfig();
                fastJsonConfig.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect);
                fastJsonConfig.setCharset(Charset.forName(charset));
                FastJsonProvider jsonProvider = new FastJsonProvider();
                jsonProvider.setCharset(Charset.forName(charset));
                jsonProvider.setFastJsonConfig(fastJsonConfig);
                ResteasyProviderFactory.getInstance().register(jsonProvider);
                getDeployment().setProviderFactory(ResteasyProviderFactory.getInstance());
            }
        }


        getDeployment().getProviderClasses().add(RpcExceptionMapper.class.getName());
        loadProviders(url.getParameter(Constants.EXTENSION_KEY, ""));
        doStart(url);
    }

上述代码7-22行,解释下,如果URL里指定了serialization而且是fastjson,就把默认的其它已经扫描到的provider清空,同时注册一个FastJsonProvider。为了满足各种编码格式的要求,对charset也一并做了解析,并传递到FastJsonConfig中。  

注:上述代码已经提交到github的个人dubbox分支,需要的朋友们直接down最新源码即可。

 

三、405 Method Not Allowed 等状态码的处理

上一节的处理方式类似,自己扩展一个ExceptionHandler即可,然后在dubbox中参考以下配置:

<dubbo:protocol name="rest" ...
extension="xxx.xxx.NotAllowedExceptionHandler,xxx.xxx.NotSupportedExceptionHandler" serialization="fastjson"
/>

extension这里可以随意扩展,多个扩展之间用英文逗号分隔即可,读取extensions的源代码见com.alibaba.dubbo.rpc.protocol.rest.BaseRestServer#loadProviders

    protected void loadProviders(String value) {
        for (String clazz : Constants.COMMA_SPLIT_PATTERN.split(value)) {
            if (!StringUtils.isEmpty(clazz)) {
                getDeployment().getProviderClasses().add(clazz.trim());
            }
        }
    }
目录
相关文章
|
8月前
|
存储 NoSQL Java
Tablestore集成MCP协议: 标量与向量混合检索的新范式
基于表格存储(Tablestore)实现的MCP(Model Context Protocol)服务,支持文档存储与混合检索工具两大功能。通过Cherry-Studio界面和通义千问qwen-max模型进行演示,展示了文本数据上传、向量嵌入及查询过程。此外,详细说明了Python和Java版本的本地运行步骤、环境配置及二次开发方法,并提供了集成三方工具如Cherry Studio的应用示例。Tablestore凭借混合查询、Serverless低成本、弹性扩展等优势,为MCP场景提供高效解决方案。
849 3
|
缓存 自然语言处理 PyTorch
Transformers 4.37 中文文档(五十三)(1)
Transformers 4.37 中文文档(五十三)
296 0
|
存储 算法 Oracle
阿里的OceanBase数据库世界第一,底层原来使用了Paxos协议
前段时间相信都被阿里的OceanBase数据库刷屏了,它击败世界头号数据库厂商Oracle,登顶全球第一。先不看新闻内容,光是看标题就足以让人耳目一新了。又是“击败”,又是“第一”,又是“打破世界纪录”。即使是IT行业的门外汉,相信也会对这个消息感到振奋。但是你知道其底层其实使用的Paxos协议吗?如果你不知道也没关系,这篇文章主要就是让你理解Paxos协议到底是个什么东西?
1692 0
阿里的OceanBase数据库世界第一,底层原来使用了Paxos协议
|
弹性计算 运维 负载均衡
阿里云云服务器ECS访问异常问题排查指引
因各种因素,用户通过私网或本地公网访问云服务器 ECS 上相关业务时,可能出现访问异常的情况。本文先对整个链路上,可能引发访问异常的相关因素及症状进行说明,然后阐述了出现异常时的排查思路及处理办法。最后对工单提交时的注意事项进行了说明。
1526 0
|
缓存 JSON Android开发
Android之OkHttp详解
Android之OkHttp详解文章大纲一、OkHttp简介二、OkHttp简单使用三、OkHttp封装四、项目源码下载 一、OkHttp简介 什么是OkHttp  一般在Java平台上,我们会使用Apache HttpClient作为Http客户端,用于发送 HTTP 请求,并对响应进行处理。
19910 0
|
存储 IDE 定位技术
如何运行geoprocessing(GP)工具
运行geoprocessing工具   每个geoprocessing工具都有一组固定需要设置的参数,他们为工具的执行提供必须的信息。
1362 0
|
4天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
14天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
下一篇
oss云网关配置