我已经将我的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)
型
1条答案
按热度按时间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您可以选择以下选项之一:
字符串
或
型