1

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

我错过了什么吗?

4

0 回答 0