JAXB多命名空间XML反序列化异常及Value字段空值问题求助
JAXB多命名空间XML反序列化问题修正方案
问题根因
你遇到的报错和Value字段为空的问题由3个核心配置错误导致:
- 命名空间URI配置不匹配:
package-info.java中ms前缀对应的命名空间URI和XML实际声明的不一致 - 字段名映射错误:
Student类中value字段未匹配XML中大写开头的<Value>标签 - 多命名空间元素配置错误:
Value类中直接在@XmlElement的name属性写前缀ms:的写法不符合JAXB规范,JAXB通过独立的namespace属性识别命名空间,不识别标签名中的前缀
分步修正代码
1. 修正package-info.java
将ms前缀对应的命名空间URI改为XML中实际声明的http://www.registar.com/ScoreVariant:
@XmlSchema( namespace="http://www.registar.com", elementFormDefault=XmlNsForm.QUALIFIED, xmlns={ @XmlNs(prefix = "", namespaceURI = "http://www.registar.com"), @XmlNs(prefix = "ms",namespaceURI = "http://www.registar.com/ScoreVariant") } ) @XmlAccessorType(XmlAccessType.FIELD) import javax.xml.bind.annotation.*;
2. 修正Student类
给value字段添加@XmlElement注解,指定匹配XML中的<Value>标签:
@Data @XmlAccessorType(XmlAccessType.FIELD) public class Student { @XmlElement private String FirstName; @XmlElement(name = "Value") private Value value; }
3. 修正Value类
删除@XmlElement中name属性的ms:前缀,单独添加namespace属性指定ms对应的命名空间URI:
@Data @XmlAccessorType(XmlAccessType.FIELD) public class Value { @XmlElements( value = { @XmlElement(name="String", namespace = "http://www.registar.com/ScoreVariant", type = String.class), @XmlElement(name="Int", namespace = "http://www.registar.com/ScoreVariant", type = Integer.class), @XmlElement(name="Double", namespace = "http://www.registar.com/ScoreVariant", type = Double.class) }) private Object value; }
4. 可选:明确指定Registry根元素的命名空间
如果还是出现根元素识别报错,给Registry类的@XmlRootElement添加namespace属性:
@Data @XmlRootElement(name="Registry", namespace = "http://www.registar.com") @XmlAccessorType(XmlAccessType.FIELD) public class Registry { @XmlElement private List<Student> Student; }
注意事项
- 确保所有JAXB注解修饰的实体类,都放在
package-info.java所在的包下,否则命名空间全局配置不会生效 - JAXB核心功能在Java 8及以下版本内置,Java 9及以上版本需要手动引入对应依赖,示例如下:
<!-- Java 9+ 需添加的Maven依赖 --> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.3.1</version> </dependency>
内容的提问来源于stack exchange,提问作者Rakshan Premsagar Kapikad
相关产品推荐
相关产品推荐

