本文共 2563 字,大约阅读时间需要 8 分钟。
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/