Jackson Xml:如何仅在 root 上添加命名空间?

Thi*_*yão 6 java jackson jackson-dataformat-xml

如果我在根元素上声明命名空间,如下所示:

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

它产生:

<PersonData xmlns="urn:stackify:jacksonxml">
    <id xmlns="">12345</id>
    <name xmlns="">Graham</name>
    <note xmlns="">Hello</note>
</PersonData>
Run Code Online (Sandbox Code Playgroud)

但我只想要根元素上的命名空间。xmlns 属性不应出现在子元素上。

我该如何存档?

And*_*rul 6

有一种解决方法,我发现对我来说更优雅。

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

@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;
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*ler 5

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

@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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • “你需要”?为什么?XML 很乐意将根元素中声明的命名空间用于所有元素。这不是Jackson的bug吗? (2认同)