Kotlin自带Map无法调用java.util.Map在webClient调用uri(uri,Map)方法时的bug

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)
        }
    }
代码参考 : 晓风轻教学视频
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值