kotlin 如何在@Serdeable annotation中使用json命名策略

6tqwzwtp  于 12个月前  发布在  Kotlin
关注(0)|答案(1)|浏览(139)

我已经将我的Micronaut应用程序升级到4.1.6,从那时起,我就面临着序列化和非序列化策略问题。使用旧版本的micronuat,我可以使用application.yml属性获得snake-case策略

jackson:
   property-naming-strategy: SNAKE_CASE

字符串
但随着升级,此属性不起作用,我得到的响应在 Camel 的情况下,如下所示

{
    "id": "84984710",
   "partId": 1111144,
   "testChangeEvents": {}
 }


我在data类上使用@Serdeable,以根据文档进行序列化或非序列化
在源代码中的类型级别对@Serdeable注解进行decode,以允许对类型进行序列化或非序列化。
但是,当我尝试使用naming属性指定naming strategy时,我遇到了问题

@Serdeable(naming = PropertyNamingStrategy.SNAKE_CASE.javaClass.kotlin)
  @JsonIgnoreProperties(ignoreUnknown = true)
  @JsonInclude(JsonInclude.Include.NON_NULL)
  data class TestTask(

     val id: Long,
     val partId: Long,
     val TestChangeEvents testChangeEvents,
  )

错误

An annotation argument must be a class literal (T::class)

 public val <T : Any> T.javaClass: Class<T>

 Returns the runtime Java class of this object.
 kotlin.jvm   JvmClassMappingKt.class 
 Gradle: org.jetbrains.kotlin:kotlin-stdlib:1.8.22 (kotlin-stdlib-1.8.22.jar)

vltsax25

vltsax251#

当前的source of Micronaut Serialization告诉我,@Serdeable接受类型为Class<? extends PropertyNamingStrategy>的参数naming这是一个java.lang.Class,而不是一个kotlin.reflect.KClass,这意味着您的代码中的错误是它应该只是PropertyNamingStrategy.SNAKE_CASE.javaClass,后面没有.kotlin(顺便说一句,如果你想使用KClass,请使用::class而不是.javaClass.kotlin)。
或者,您可以通过执行naming = SnakeCaseStrategy::class.javaClass直接使用io.micronaut.serde.config.naming.SnakeCaseStrategy
tl;dr您可以选择以下选项之一:

@Serdeable(naming = PropertyNamingStrategy.SNAKE_CASE.javaClass)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
data class TestTask(
   val id: Long,
   val partId: Long,
   val TestChangeEvents testChangeEvents,
)

字符串

@Serdeable(naming = SnakeCaseStrategy::class.javaClass)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
data class TestTask(
   val id: Long,
   val partId: Long,
   val TestChangeEvents testChangeEvents,
)

相关问题