我需要为 XML 提供共享机密属性,所以我决定添加它而不将它暴露给我的 API。
@JacksonXmlRootElement(localName = "Request")
data class TestRequest(@JacksonXmlText val request: String)
这是示例 POJO,在序列化程序之后它看起来像
<Request>text</Request>
我需要为其添加属性,例如
<Request secret="foobar">text</Request>
我查看了 Jackson API,看起来我需要为 root 创建自定义序列化程序,所以
class SessionModule: SimpleModule("Test serializer", PackageVersion.VERSION) {
override fun setupModule(context: SetupContext) {
context.addBeanSerializerModifier(object : XmlBeanSerializerModifier() {
override fun modifySerializer(config: SerializationConfig, beanDesc: BeanDescription, serializer: JsonSerializer<*>): JsonSerializer<*> {
val modifiedSerializer = super.modifySerializer(config, beanDesc, serializer)
if (modifiedSerializer is XmlBeanSerializer) {
println("Registering custom serializer")
return SessionFieldSerializer(modifiedSerializer)
}
return modifiedSerializer
}
})
}
}
还有我什么都不做的自定义序列化程序
class SessionFieldSerializer: XmlBeanSerializer {
constructor(src: BeanSerializerBase?) : super(src)
constructor(src: XmlBeanSerializerBase?, objectIdWriter: ObjectIdWriter?, filterId: Any?) : super(src, objectIdWriter, filterId)
constructor(src: XmlBeanSerializerBase?, objectIdWriter: ObjectIdWriter?) : super(src, objectIdWriter)
constructor(src: XmlBeanSerializerBase?, toIgnore: MutableSet<String>?) : super(src, toIgnore)
override fun serialize(bean: Any?, g: JsonGenerator?, provider: SerializerProvider?) {
TODO()
}
}
因此,它所做的只是抛出未实现的异常,但是即使 SessionFieldSerializer() 被实例化(我看到“Registering custom serializer”消息),也不会调用序列化函数。
测试代码:
val mapper = XmlMapper()
mapper.registerModule(KotlinModule())
mapper.registerModule(SessionModule())
val request = TestRequest("Foobar")
val test = mapper.writeValueAsString(request)
println(test)
我错过了什么吗?