【问题标题】:Micronaut - Bind Get parameter object in ControllerMicronaut - 在控制器中绑定获取参数对象
【发布时间】:2019-09-21 01:27:42
【问题描述】:

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

我的数据类是这样的

data class MyData(
   val myDate: LocalDate
)

还有我的控制器:

@Controller
class MyController {

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

}

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

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

谢谢:)

【问题讨论】:

  • “我希望有一种方法可以直接绑定对象本身,而无需手动重新创建对象:”什么意思?具体是什么不起作用?
  • “我正在实现一个带有 GET 端点的控制器,它应该接收以下简化数据:” - 为什么要使用 GET 请求将 JSON 发送到服务器?
  • 在我的实际应用程序中,我的 GET 中有大约 8-10 个参数,我必须手动将它们组合到一个对象中。我希望有一种类似 Spring 的方法可以将对象本身绑定到请求,就像你在 Spring 中可以做的那样。它也适用于日期和嵌套对象:blog.codecentric.de/en/2017/08/…stackoverflow.com/questions/16942193/…。 @JeffScottBrown 我将编辑我的问题以使其更清楚。
  • 没用过Micronaut,但我花了20秒才找到这个,这似乎准确地描述了你想要做什么:docs.micronaut.io/latest/guide/index.html#binding
  • 其完成方式在文档中描述:docs.micronaut.io/latest/guide/index.html#_bindable_types

标签: kotlin micronaut


【解决方案1】:

完整的工作示例:

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"

【讨论】:

  • 感谢您提供代码。如果 MyData 的属性不止一个,会发生什么情况?
  • 你需要相应地调整MyDataConverter
  • 是的,但是我有一个原始字符串,必须手动解析 MyData 对象?
  • 是的。你可以这样做:jacksonObjectMapper().readValue&lt;MyData&gt;(jsonString, MyData::class.java)
  • 但正如其他人已经说过的:不要在查询参数中发送 json。只需做一个帖子并将其放入正文中。这将为您省去麻烦(即编码问题等)
猜你喜欢
  • 1970-01-01
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 2016-12-26
相关资源
最近更新 更多