6

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

@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 属性不应出现在子元素上。

我该如何存档?

4

3 回答 3

7

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

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

@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;
}
于 2020-03-12T19:28:56.807 回答
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;
}

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

于 2018-10-26T05:52:22.847 回答
0

也适用于不可变库和 json 注释(如果您需要在 JSON 和 XML 中序列化/反序列化)

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

}
于 2020-04-01T14:05:04.133 回答