spring-boot - Kotlin的一般性问题

标签 spring-boot generics kotlin resttemplate

我正在尝试实现用于处理外部API调用的基本功能:

   inline fun <reified T> get(url: String): T? {

        try {

            val restTemplate = RestTemplate()
            val response = restTemplate.exchange<Any>(
                url,
                HttpMethod.GET,
                headersForRestTemplate,
                T::class)

            return response.getBody() as T

        } catch (e: Exception) {
            log.info("Exception ::" + e.message)
            throw ServiceException(e)
        }

    }

我所说的方式非常简单:
 api.get<SWObject>(Utils.SW_API)

尝试执行该代码时,出现强制转换异常:
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to jp.co.xx.demo.models.SWObject

返回的对象不是SWObject类的实例,而是LinkedHashMap。我仍在努力使用reifiedinline关键字,如果我的实现未遵循最佳做法,则感到抱歉。

最佳答案

T::class.java方法中使用T::class代替exchange,并从Any方法调用中删除显式类型参数exchange,因为它不必要。您也不需要将响应主体强制转换为T

inline fun <reified T> get(url: String): T? {
    try {
        val restTemplate = RestTemplate()
        val response = restTemplate.exchange(
            url,
            HttpMethod.GET,
            headersForRestTemplate,
            T::class.java
        )

        return response.getBody()
    } catch (e: Exception) {
        log.info("Exception ::" + e.message)
        throw ServiceException(e)
    }
}

Object::class返回Kotlin类(KClass),而Object::class.java返回Java类(Class),等效于Java的Object.class。请注意,KClassClass不同。
exchange方法只是希望其responseType参数是Class(或ParametrizedTypeReference,但事实并非如此)的类型。

关于spring-boot - Kotlin的一般性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57155842/

相关文章:

java - 在嵌入式 tomcat 中以 ROOT 身​​份部署

spring-boot - 用户角色 Spring Data Rest Spring security

mysql - 恩弗斯 + MYSQL + 列表 <字符串> = SQLSyntaxErrorException : Specified key was too long;

Spring 数据预测

spring-boot - spring auto reload 可以像 grails 一样改变吗?

java - Wicket 中的 Form<Void> (或一般使用 Void 类型)

C# - 有什么方法可以转换泛型集合吗?

JavaFx 使用反射和自定义注释创建 TableColumn : can't create instance of parameter typed class

functional-programming - 使用函数式编程计算每个标签的出现次数

安卓 : Animate Rating Bar to expand and shrink each star