Ray Tsang
Ray Tsang
请问这个问题目前有办法处理吗
sending request in Service Center is worked,but not work with CSERestTemplate
network info in chrome Request URL: https://*/cse/service/uploadLog payload: ------WebKitFormBoundary6XjKBy4C1GAEaRpH Content-Disposition: form-data; name="hostname" 7777777777 ------WebKitFormBoundary6XjKBy4C1GAEaRpH Content-Disposition: form-data; name="runLog"; filename="Bi.log" Content-Type: application/octet-stream ------WebKitFormBoundary6XjKBy4C1GAEaRpH-- response: uploadAnalysisLog succeed
发现在依赖的sdk包中存在ProduceProcessor的SPI配置 FastJsonProduceProcessor StringProduceProcessor org.apache.servicecomb.common.rest.codec.produce.ProduceJsonProcessor org.apache.servicecomb.common.rest.codec.produce.ProduceTextPlainProcessor 前两个可以进行配置关闭,后两个还是会起作用,继而出现异常 java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.alibaba.fastjson.JSONObject
restTemplate.getForObject(url, JSONObject.class)
跟踪代码发现,CSERestTemplate中的类型参数和原生RestTemplate中的含义是有很大差异的,因为CSERestTemplate并不支持HttpMessageConverter(它能将响应数据转化为客户端真正想要的数据类型),CSERestTemplate的类型实际则依赖服务端,服务端响应数据结果定义不好、不清晰,客户端跟着摆烂。尤其在这种平台+微服务APP的情况下,上下游存在很大的差别,在开发的方方面面上
平台服务端提供的接口 ,从JavaType responseType = invocation.findResponseType(responseEx.getStatus());获取到responseType大部分都是Object.class,ProduceJsonProcessor转化之后就是个Map;客户端就得自己去完成转换,大量的这类代码。如果平台主动去改服务端,几十个客户端也得跟着动,就因为servicecomb这种类型的强相关
> `restTemplate.getForObject(url, Map.class)` 或者 `restTemplate.getForObject(url, Object.class)` 可以? 可以的,但是这种写法真的是缺少了RestTemplate中的精华:类型转换,增加了业务层的复杂
> > `restTemplate.getForObject(url, Map.class)` 或者 `restTemplate.getForObject(url, Object.class)` 可以? > > 可以的,但是这种写法真的是缺少了RestTemplate中的精华:类型转换,增加了业务层的复杂 有点先入为主,但是这种东西,不得不承认,用起来很舒服
> > 发现在依赖的sdk包中存在ProduceProcessor的SPI配置 FastJsonProduceProcessor StringProduceProcessor org.apache.servicecomb.common.rest.codec.produce.ProduceJsonProcessor org.apache.servicecomb.common.rest.codec.produce.ProduceTextPlainProcessor 前两个可以进行配置关闭,后两个还是会起作用,继而出现异常 java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.alibaba.fastjson.JSONObject > > 估计你的咨询下你们项目这块的背景。FastJsonProduceProcessor 应该就是处理你说的场景的。 java chassis默认情况下并不支持JsonObject,也不建议这么使用。 详细说明参考: https://servicecomb.apache.org/references/java-chassis/zh_CN/build-provider/interface-constraints.html 跟我们项目没啥关系,我们直接被平台挖的坑绊倒了。我跟完代码后,也慢慢理解为啥他为啥怎么做了:从JavaType responseType = invocation.findResponseType(responseEx.getStatus());获取到responseType大部分都是Object.class,ProduceJsonProcessor转化之后就是个Map,自已搞个FastJsonProduceProcessor 转换成JSONObject(提供了get().asXXX()),好像是比Map取值强转好多l