微服务远程调用返回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对象的主要内容,如果未能解决你的问题,请参考以下文章

LinkedHashMap如何转对象的问题

设计一个微服务用户API网关

微服务设计笔记——几种远程过程调用方法

在微服务 REST api 调用中返回对象列表是不好的做法吗?

2.微服务--RPC

微服务实践分享 控制调用中心