博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
dubbox REST服务使用fastjson替换jackson
阅读量:6843 次
发布时间:2019-06-26

本文共 2563 字,大约阅读时间需要 8 分钟。

讲解了resteasy如何使用fastjson来替换默认的jackson,虽然dubbox内部采用的就是resteasy,但是大多数情况下,dubbox服务是一个独立的app,并不需要以war包形式部署在外置容器中,也就没有web.xml。好在dubbox扩展性不错,很容易扩展,有此类需求的可以参考下面的做法:
 
一、rest协议指定fastjson做为序列化
注意这里的: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的分支,需要的朋友们直接down最新源码即可。

 

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

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

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

转载地址:http://qjcul.baihongyu.com/

你可能感兴趣的文章
mysql 环境配置
查看>>
Linux:which,locate,whereis,find等区别
查看>>
notepad2正则表达式替换字符串
查看>>
svn安装配置
查看>>
跟我学Spring Cloud(Finchley版)-20-Spring Cloud Config-Git仓库配置详解
查看>>
集合——Hashtable与ConcurrentHashMap区别
查看>>
/bin、/sbin、/usr/bin、/usr/bin的区别
查看>>
手机打开USB调试(OPPO)
查看>>
关于node 符号链接符号过多的问题
查看>>
GBin1分享的8个图片360度旋转展示的jQuery插件
查看>>
分享11个超棒的移动应用(mobile apps)开发解决方案
查看>>
【Spring】依赖注入三种方式
查看>>
【安全牛学习笔记】 本地提权
查看>>
VS2017 创建NET Core 1.1 Web项目,发布后找不到引用的js文件
查看>>
Linux_Mail_Server
查看>>
网络相关排查总结
查看>>
C++错误收集(2)
查看>>
博客园的老虞要搬家罗
查看>>
Data Pump需要用到steam pool
查看>>
异步7月上市新书,送出一本你爱的
查看>>