微服务远程调用返回linkedhashMap对象
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微服务远程调用返回linkedhashMap对象相关的知识,希望对你有一定的参考价值。
参考技术A 关于远程调用返回linkedhashMap原因:因为rpc远程调用在底层还是使用的HTTPClient,所以在传递参数的时候,必定要有个顺序,当你传递map的时候map里面的值也要有顺序,不然服务层在接的时候就出问题了,所以它才会转为linkedhashMap。
spring 有一个类叫ModelMap,继承了linkedhashMap public
class ModelMap extends
LinkedHashMap,所以一个接口返回的结果就可以直接用ModelMap来接,注意ModelMap是没有泛型的,不管你返回的结果是什么类型的map,泛型是多复杂的map,都可以直接new一个Modelmap,用它来接返回的结果。
ObjectMapper mapper =new ObjectMapper();
List recommendGroupList = mapper.convertValue(resultMap.get("records"),
new TypeReference>());
以上处理方法需要将接收的对象用:@JsonIgnoreProperties(ignoreUnknown =true) 否则当别的服务新增字段时候,本服务没同步增加会报错.。
微服务中从其他服务获取过来的对象,如果从Object强转为自定义的类型会报错,利用ObjectMapper转换。
ObjectMapper mapper =new ObjectMapper();
DefaultResponse defaultResponse = proxy.getData();
Listresources = () defaultResponse.getData(); //这里的场景是:data是一个Object类型的,但是它其实是一个List,想把List中的每个对象分别转成可用的对象for(inti = 0; i < serviceDateResources.size(); i++)
Resource resource = mapper.convertValue(resources.get(i), Resource.class); //经过这步处理,resource就是可用的类型了,如果不转化会报错
上面转换的过程中,如果返回的字段你不是都需要,需要忽略其中的几个字段,在自定义的类中添加如下:
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
@JsonIgnoreProperties(ignoreUnknown =true)
public class Resource // private Integer orderId; //提供有这个参数,但是不想获取 private Integer otrerFiled;
或者下面方法:这两种方法不用添加注解
一:ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD,Visibility.ANY);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
二:ObjectMapperobjectMapper=newObjectMapper();mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
ObjectMapper可以实现对象到json等其他格式的互转。如果向将java对象转成Json格式,可以用:
ObjectMapper mapper =new ObjectMapper();
mapper.writeValueAsString(object);
会有JsonProcessingException异常,需要自己处理。在转换的过程中,有可能有的属性被设成空就不序列化等的需求,可以在类的属性上或直接在类上加上一下注解。用在属性上就是只针对一个属性,用在类上就是针对类里的所有属性。
@JsonInclude(Include.NON_NULL)
@JsonInclude(Include.Include.ALWAYS) 默认
@JsonInclude(Include.NON_DEFAULT) 属性为默认值不序列化
@JsonInclude(Include.NON_EMPTY) 属性为 空(“”) 或者为 NULL 都不序列化
@JsonInclude(Include.NON_NULL) 属性为NULL 不序列化
因为我是图片上传,应用如下:
R uploadFile = uploadFeignService.Upload(file, userId);//获取远程对象
ObjectMapper mapper = new ObjectMapper();//进行转换
String jsonStr =mapper.writeValueAsString(uploadFile.get("filePath"));//将linkedhashMap转为json
JSONObject jsondata= JSON.parseObject(jsonStr);//json对象
String path = jsondata.getString("path");
以上是关于微服务远程调用返回linkedhashMap对象的主要内容,如果未能解决你的问题,请参考以下文章