Jackson Xml:如何仅在根目录上添加名称空间?

时间:2018-08-21 11:07:58

标签: java jackson jackson-dataformat-xml

如果我在根元素上声明了名称空间,像这样:

@JacksonXmlRootElement(namespace = "urn:stackify:jacksonxml", localName = "PersonData")
public class Person {
    private String id;
    private String name;
    private String note;
}

它产生:

<PersonData xmlns="urn:stackify:jacksonxml">
    <id xmlns="">12345</id>
    <name xmlns="">Graham</name>
    <note xmlns="">Hello</note>
</PersonData>

但是我只希望名称空间位于根元素上。 xmlns属性不应出现在子元素上。

我该如何存档?

3 个答案:

答案 0 :(得分:4)

有一种变通方法,我觉得这对我来说更优雅。

您可以像这样为您的命名空间定义常量:

@JacksonXmlRootElement(localName = "PersonData")
public class Person {

    @JacksonXmlProperty(isAttribute = true)
    private final String xmlns = "urn:stackify:jacksonxml";

    private String id;
    private String name;
    private String note;
}

答案 1 :(得分:2)

您需要在每个属性中指定与根元素相同的名称空间:

@JacksonXmlRootElement(namespace = "urn:stackify:jacksonxml", localName = "PersonData")
public class Person {
    @JacksonXmlProperty(namespace = "urn:stackify:jacksonxml")
    private String id;
    @JacksonXmlProperty(namespace = "urn:stackify:jacksonxml")
    private String name;
    @JacksonXmlProperty(namespace = "urn:stackify:jacksonxml")
    private String note;
}

这有点烦人,但这是我发现避免不必要的名称空间的唯一方法。

答案 2 :(得分:0)

还可以与不可变库和json注释一起使用(如果您需要同时在JSON和XML中进行序列化/反序列化)

@Value.Immutable
@JsonRootName(value = "PersonData", namespace = "urn:stackify:jacksonxml")
public interface Person extends Serializable {

}