首页 > 解决方案 > Micronaut - 在控制器中绑定获取参数对象

问题描述

我正在实现一个带有 GET 端点的控制器,它应该接收以下请求:/mycontroller?myDate=2019-05-01

我的数据类看起来像这样

data class MyData(
   val myDate: LocalDate
)

我的控制器:

@Controller
class MyController {

  @Get("{?mydata*}")
  fun getMyEndpoint(mydata: MyData)...

}

Micronaut 仅在我为 提供默认构造函数的情况下绑定请求MyData,从而使myDate可空或提供默认值 - 这些都不是我想要做的。

有没有办法在不提供默认构造函数的情况下让它工作?例如杰克逊也可以处理它。

谢谢 :)

标签: kotlinmicronaut

解决方案


完整的工作示例:

import io.micronaut.core.convert.ConversionContext
import io.micronaut.core.convert.TypeConverter
import io.micronaut.http.annotation.Controller
import io.micronaut.http.annotation.Get
import java.time.LocalDate
import java.util.*
import javax.inject.Singleton

@Controller("/base")
class MyController {

   @Get("/path")
   fun getMyEndpoint(myData: MyData) {
      println("MyData: $myData")
   }

}

data class MyData(
   val myDate: LocalDate
)

@Singleton
class MyDataConverter : TypeConverter<String, MyData> {
   override fun convert(obj: String, targetType: Class<MyData>, context: ConversionContext?): Optional<MyData> =
      Optional.of(MyData(myDate = LocalDate.parse(obj)))
}

专业提示:如果您使用 Jackson 和 Kotlin,请不要忘记包含jackson-module-kotlin依赖项:

compile "com.fasterxml.jackson.module:jackson-module-kotlin:$YourJacksonVersionHere"

推荐阅读