Micronaut - Bind Получить объект параметра в контроллере - PullRequest
2 голосов
/ 02 мая 2019

Я реализую контроллер с конечной точкой GET, который должен получить следующий запрос: /mycontroller?myDate=2019-05-01

Мой класс данных выглядит следующим образом

data class MyData(
   val myDate: LocalDate
)

И мой контроллер:

@Controller
class MyController {

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

}

Микронавт связывает запрос только в том случае, если я предоставляю конструктор по умолчанию для MyData, таким образом делая myDate обнуляемым или предоставляя значение по умолчанию - ни одно из этих действий я не хочу делать.

Есть ли способ заставить это работать без предоставления конструктора по умолчанию?Джексон, например, может также справиться с этим.

Спасибо:)

1 Ответ

1 голос
/ 03 мая 2019

Полный рабочий пример:

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)))
}
  • Выполните вызов на ваш сервер (например, если он работает на порту 8080):
  • Вы увидите вывод на консоли сервера.

Совет: Pro: , если вы используете Джексона и Котлина Донане забудьте включить зависимость jackson-module-kotlin :

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