1. 程式人生 > 其它 >Kotlin自帶Map無法呼叫java.util.Map在webClient呼叫uri(uri,Map)方法時的bug

Kotlin自帶Map無法呼叫java.util.Map在webClient呼叫uri(uri,Map)方法時的bug

技術標籤: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) } }

程式碼參考 : 曉風輕教學視訊