微服務(wù)遠(yuǎn)程調(diào)用返回linkedhashMap對(duì)象

關(guān)于遠(yuǎn)程調(diào)用返回linkedhashMap原因:

因?yàn)閞pc遠(yuǎn)程調(diào)用在底層還是使用的HTTPClient,所以在傳遞參數(shù)的時(shí)候,必定要有個(gè)順序,當(dāng)你傳遞map的時(shí)候map里面的值也要有順序,不然服務(wù)層在接的時(shí)候就出問(wèn)題了,所以它才會(huì)轉(zhuǎn)為linkedhashMap。

spring 有一個(gè)類(lèi)叫ModelMap,繼承了linkedhashMap public

class ModelMap extends

LinkedHashMap,所以一個(gè)接口返回的結(jié)果就可以直接用ModelMap來(lái)接,注意ModelMap是沒(méi)有泛型的,不管你返回的結(jié)果是什么類(lèi)型的map,泛型是多復(fù)雜的map,都可以直接new一個(gè)Modelmap,用它來(lái)接返回的結(jié)果。

ObjectMapper mapper =new ObjectMapper();

List recommendGroupList = mapper.convertValue(resultMap.get("records"),

? ? ? ? new TypeReference>(){});

以上處理方法需要將接收的對(duì)象用:@JsonIgnoreProperties(ignoreUnknown =true) 否則當(dāng)別的服務(wù)新增字段時(shí)候,本服務(wù)沒(méi)同步增加會(huì)報(bào)錯(cuò).。

微服務(wù)中從其他服務(wù)獲取過(guò)來(lái)的對(duì)象,如果從Object強(qiáng)轉(zhuǎn)為自定義的類(lèi)型會(huì)報(bào)錯(cuò),利用ObjectMapper轉(zhuǎn)換。

ObjectMapper mapper =new ObjectMapper();

DefaultResponse defaultResponse = proxy.getData();

Listresources = () defaultResponse.getData();? //這里的場(chǎng)景是:data是一個(gè)Object類(lèi)型的,但是它其實(shí)是一個(gè)List,想把List中的每個(gè)對(duì)象分別轉(zhuǎn)成可用的對(duì)象for(inti = 0; i < serviceDateResources.size(); i++) {

? ? Resource resource = mapper.convertValue(resources.get(i), Resource.class);? //經(jīng)過(guò)這步處理,resource就是可用的類(lèi)型了,如果不轉(zhuǎn)化會(huì)報(bào)錯(cuò)

}

上面轉(zhuǎn)換的過(guò)程中,如果返回的字段你不是都需要,需要忽略其中的幾個(gè)字段,在自定義的類(lèi)中添加如下:

import org.codehaus.jackson.annotate.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown =true)

public class Resource {//? private Integer orderId; //提供有這個(gè)參數(shù),但是不想獲取? 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可以實(shí)現(xiàn)對(duì)象到j(luò)son等其他格式的互轉(zhuǎn)。如果向?qū)ava對(duì)象轉(zhuǎn)成Json格式,可以用:

ObjectMapper mapper =new ObjectMapper();

mapper.writeValueAsString(object);

會(huì)有JsonProcessingException異常,需要自己處理。在轉(zhuǎn)換的過(guò)程中,有可能有的屬性被設(shè)成空就不序列化等的需求,可以在類(lèi)的屬性上或直接在類(lèi)上加上一下注解。用在屬性上就是只針對(duì)一個(gè)屬性,用在類(lèi)上就是針對(duì)類(lèi)里的所有屬性。

@JsonInclude(Include.NON_NULL)

@JsonInclude(Include.Include.ALWAYS) 默認(rèn)

@JsonInclude(Include.NON_DEFAULT) 屬性為默認(rèn)值不序列化

@JsonInclude(Include.NON_EMPTY) 屬性為 空(“”) 或者為 NULL 都不序列化

@JsonInclude(Include.NON_NULL) 屬性為NULL 不序列化

因?yàn)樾【幨菆D片上傳,應(yīng)用如下:

? ? R uploadFile = uploadFeignService.Upload(file, userId);//獲取遠(yuǎn)程對(duì)象

? ? ObjectMapper mapper = new ObjectMapper();//進(jìn)行轉(zhuǎn)換

? ? String jsonStr =mapper.writeValueAsString(uploadFile.get("filePath"));//將linkedhashMap轉(zhuǎn)為json

? ? JSONObject jsondata= JSON.parseObject(jsonStr);//json對(duì)象

? ? String path = jsondata.getString("path");

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容