Kotlin自帶Map無法呼叫java.util.Map在webClient呼叫uri(uri,Map)方法時的bug
阿新 • • 發佈:2021-02-06
技術標籤:springboot
Kotlin在使用WebClient呼叫uri(uri,Map)方法時,並不會拼接params,編譯器也不會出錯。具體是因為uri還有一個方法uri(uri, Object…),Kotlin特有的Map和java.util.Map並不一樣。
解決方案:是用UriComponentsBuilder的queryParams(MultiValueMap)拼接好了再呼叫uri(URI)傳入。
下面是囉嗦的:
發現的原因是webclient在編寫使用動態代理模擬retrofit2風格的REST消費方式時,定義了一個RestHandler介面,webclient去實現時用uri(uri,Map)無法傳遞正確的引數。
/**
* 處理rest請求
*/
override fun invokeRest(methodInfo: MethodInfo): Any {
//構建Uri
val uri = UriComponentsBuilder
.fromUriString(serverInfo.url)
.path(methodInfo.uri)
.queryParams(methodInfo.params).build().encode().toUri()
val request = client
.method(methodInfo.method)
.uri(uri)
.accept(MediaType.APPLICATION_JSON)
//發出請求
val retrieve = methodInfo.body?.let {
request.body(it,methodInfo.bodyElementType).retrieve()
}?: request.retrieve()
//處理異常
retrieve. onStatus( {status -> status.value() == 404 }, { Mono.just(RuntimeException("not found"))})
//處理body
return if (methodInfo.isReturnFlux){
retrieve.bodyToFlux(methodInfo.returnElementType)
}else{
retrieve.bodyToMono(methodInfo.returnElementType)
}
}