在不修改POJO的情况下将属性添加到XML

时间:2018-08-17 08:25:57

标签: kotlin jackson jackson-dataformat-xml

我需要为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)

我想念什么吗?

0 个答案:

没有答案