【问题标题】:Jackson Xml: How to add namespace only on root?Jackson Xml:如何仅在根目录上添加命名空间?
【发布时间】:2018-08-21 11:07:58
【问题描述】:

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

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

我该如何存档?

【问题讨论】:

    标签: java jackson jackson-dataformat-xml


    【解决方案1】:

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

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

    @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。这是一个聪明的黑客。它创建一个名为xmlns 的属性并将其设置为一个值。解析器对输出感到满意。但是,这并没有以其他使用 xml 和您的类的框架(例如 JAXB)可以理解的方式定义命名空间。
    【解决方案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;
    }
    

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

    【讨论】:

    • “你需要”?为什么? XML 乐于使用在根元素中为所有元素声明的命名空间。这不是杰克逊的一个错误吗?
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-10
      • 2010-10-30
      • 2015-10-04
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      • 2016-07-08
      • 2012-02-21
      相关资源
      最近更新 更多