【问题标题】:How to use Spring HATEOAS "linkTo" with Kotlin DSL?如何在 Kotlin DSL 中使用 Spring HATEOAS“linkTo”?
【发布时间】:2020-09-21 21:30:50
【问题描述】:

Spring HATEOAS 的 linkTo 方法有一个 Kotlin 变体,它为 Controller 采用具体的类型参数,为 body 采用函数:

org.springframework.hateoas.server.mvc WebMvcLinkBuilderDslKt.class public inline fun <reified C> linkTo(
    func: C.() → Unit
): WebMvcLinkBuilder

但我不知道如何实际使用它,因为我没有找到任何有用的文档,而且 API 也不是很直观。我试过这样:

linkTo<MyHandler> { findById(req) }.toUriComponentsBuilder().build(mapOf("id" to 1)).toURL()

如果链接应该指向另一个方法,我认为使用环绕方法的req 对象是错误的。结果只是http://localhost:8080,没有任何路径或参数。

如何使用 Kotlin DSL 建立链接?

由于我使用的是 Spring WebMvc.fn:还有其他方法可以使用此框架构建链接吗?

【问题讨论】:

    标签: spring spring-mvc kotlin spring-hateoas


    【解决方案1】:

    linkTo 函数的func 参数是带有接收器的函数,其中接收器必须是 Spring 控制器。在函数内部,您应该调用控制器的方法之一。当 Spring HATEOAS 调用 func 时,它作为接收者传递,而不是实际的控制器,而是代理。拦截代理上的方法调用,并根据方法调用(包括方法调用参数)创建链接。

    给定一个控制器:

    @RestController
    class TestController {
    
        @RequestMapping("/test/{path-var}")
        @ResponseBody
        fun test(@PathVariable("path-var") pathVar: String,
                 @RequestParam("param") param: Int) = Response()
    }
    

    以下调用将产生http://localhost:8080/test/any?param=123

    linkTo<TestController> { test("any", 123) }
    

    【讨论】:

    • 感谢您的解释。如果它基于代理,我认为没有机会让它与Spring WebMvc.fn 一起工作,因为 HTTP 处理程序方法只接受单个请求对象,而不接受专用参数列表。
    猜你喜欢
    • 2019-12-01
    • 2021-05-07
    • 1970-01-01
    • 2018-02-06
    • 2019-07-10
    • 2018-02-17
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多