在 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());
我目前有这个:
@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());