關(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");