我需要为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()实例化(我看到“正在注册自定义序列化程序”消息),也不会调用序列化功能。
测试代码:
val mapper = XmlMapper()
mapper.registerModule(KotlinModule())
mapper.registerModule(SessionModule())
val request = TestRequest("Foobar")
val test = mapper.writeValueAsString(request)
println(test)
我想念什么吗?