JAXB生成XML子元素未继承父元素命名空间问题排查
JAXB生成类时子元素未继承父元素命名空间的问题
我用JAXB生成XML编组/解组的类时碰到个头疼的问题——父元素的命名空间只作用在自己身上,子类对应的XML子元素完全没继承这个命名空间,折腾了好久都没找到问题根源。下面是我用到的相关文件信息:
相关文件片段
XSD文件(ItemResponses.xsd)
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://w.com/" targetNamespace="http://w.com/" elementFormDefault="qualified" version="1.3.2"> <!-- 这里是后续的元素定义内容,比如父元素、子元素的结构定义 --> </xsd:schema>
JAXB生成的类示例
父类的注解大概是这样的:
@XmlRootElement(namespace = "http://w.com/") @XmlType(namespace = "http://w.com/") public class ParentItem { private ChildItem child; @XmlElement(name = "Child") public ChildItem getChild() { return child; } public void setChild(ChildItem child) { this.child = child; } }
子类的注解则没有指定命名空间:
public class ChildItem { private String value; @XmlElement(name = "Value") public String getValue() { return value; } public void setValue(String value) { this.value = value; } }
问题排查与解决思路
首先看你的XSD已经设置了elementFormDefault="qualified",按道理所有元素都应该关联目标命名空间,那问题大概率出在JAXB生成类的配置或者注解上,给你几个排查方向:
- 给子类添加命名空间注解:JAXB不会自动继承父类的命名空间,所以必须给子类也加上
@XmlType(namespace = "http://w.com/"),这样子类对应的XML元素才会归属到目标命名空间下。 - 检查xjc生成时的绑定配置:如果你是用xjc工具生成类,有没有用绑定文件(binding.xml)?如果绑定文件里意外覆盖了命名空间设置,就会导致子元素不继承。可以添加一个全局绑定配置强制所有元素使用目标命名空间:
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" version="2.1"> <jaxb:globalBindings elementFormDefault="qualified"/> </jaxb:bindings>
然后用xjc命令时指定这个文件:xjc -b binding.xml ItemResponses.xsd
- 显式指定XmlElement的命名空间:保险起见,在父类的
@XmlElement注解里也加上namespace属性,比如@XmlElement(name = "Child", namespace = "http://w.com/"),确保子元素的命名空间被明确指定。 - 验证XML的实际命名空间:有时候可能是视觉错觉——如果XML用了默认命名空间,子元素不需要写前缀,但实际是属于目标命名空间的。可以用XML验证工具检查子元素的命名空间是否正确。
内容的提问来源于stack exchange,提问作者user9598778
相关产品推荐
相关产品推荐

