声明性客户端 URI 参数的类型转换

Type conversion of declarative client URI argument

我正在 Micronaut 中实现一个声明式客户端,如下所示:

@Get("/dostuff{?requestObject*}")
fun getStuff(requestObject: MyRequestObject): String

我的 MyRequestObject 包含一个由某个字符串表示的枚举:

data class MyRequestObject(val myEnum: MyEnum)

enum class MyEnum(val stringRep: String) {
  AREASONABLENAME("someSillyString");
}

当我现在通过客户端发送请求时,来自 requestObject 的值生成以下查询 /?myEnum=AREASONABLENAME。我真正需要的是 /?myEnum=someSillyString.

我尝试了以下操作但没有成功:

  1. 将 JsonValue 函数添加到 MyEnum: @JsonValue fun getJsonValue() = stringRep - 当然没有帮助

  2. 为 MyEnum

    实施 TypeConverter
    @Singleton
    class MyEnumTypeConverter : TypeConverter<MyEnum, String> {
        override fun convert(`object`: MyEnum?, targetType: Class<String>?, context: ConversionContext?): Optional<String> {
            return Optional.ofNullable(`object`?.stringRep)
        }
    }
    

有没有办法实现所需的行为?

您可以覆盖 Enum 中的 toString 方法,以便当转换器尝试将其转换为字符串时您可以控制操作的结果:

enum class MyEnum(val stringRep: String) {
  AREASONABLENAME("someSillyString");

  override fun toString(): String {
    return stringRep
  }
}