在 Jackson 中动态设置 XML 命名空间

Dynamically set XML namespace in Jackson

我目前有这个:

@JacksonXmlRootElement(namespace = "some-ns", localName = "queryResult")
public class QueryResult {
    ...
}

现在我需要通过配置文件使 "some-ns" 可配置(即在运行时设置)。

实现此目标的最佳方法是什么?

您可以编写自定义 AnnotationIntrospector

import com.fasterxml.jackson.databind.PropertyName;
import com.fasterxml.jackson.databind.introspect.AnnotatedClass;
import com.fasterxml.jackson.dataformat.xml.JacksonXmlAnnotationIntrospector;

public class MyJacksonXmlAnnotationIntrospector extends JacksonXmlAnnotationIntrospector
{
    private static final long serialVersionUID = 1L;

    @Override
    public PropertyName findRootName(AnnotatedClass ac) {
        PropertyName pn = super.findRootName(ac);
        return pn.withNamespace("custom"); 
    }
}

然后将其传递给 jackson 映射器:

    XmlMapper xmlMapper = new XmlMapper();
    xmlMapper.setAnnotationIntrospector(new MyJacksonXmlAnnotationIntrospector());
    xmlMapper.writeValue(System.out, new QueryResult());