JAXB解组与编组问题排查及修正请求:反射警告、编组错误、Hobby标签值无法获取
JAXB解组/编组问题解决方案
Hey there, let's work through each of your JAXB issues step by step:
1. 非法反射访问警告解决
这个警告根源是JAXB 2.3.0版本与Java 9+的模块系统不兼容——旧版本JAXB会通过反射访问JDK内部API,而Java 9+收紧了这类访问权限。这里有几个实用解决方向:
- 升级JAXB版本(推荐):把jaxb-runtime依赖升级到2.3.1或更高版本(比如2.4.0),新版本已经修复了反射兼容性问题。如果用Maven,修改pom.xml:
<dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>2.4.0</version> </dependency> - 临时添加JVM启动参数:如果暂时无法升级,运行程序时添加参数允许非法访问(注意:这是临时方案,未来Java版本会彻底禁止此类访问):
--illegal-access=permit - 迁移到Jakarta XML Binding:JAXB已纳入Jakarta EE体系,建议逐步迁移到Jakarta版本(将
javax.xml.bind替换为jakarta.xml.bind),从根源避免版本兼容问题。
2. 编组时"Neither the class com.sun.xml.bind.v2.runtime.JAXBContextImpl nor one of the associated superclasses is known to this context"错误
看你的主程序代码,问题出在编组时传入的对象完全错误!你写的是:
jaxbMarshaller.marshal(jaxbContext_w, System.out);
这里你把JAXBContext实例传给了marshal方法,但实际上应该传入解组得到的Education对象(也就是entries变量)。修改这一行代码:
jaxbMarshaller.marshal(entries, System.out);
另外可以优化代码,JAXBContext是线程安全的,不需要重复创建,复用一个实例即可:
JAXBContext jaxbContext = JAXBContext.newInstance(Education.class); // 解组操作 Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); Education entries = (Education) jaxbUnmarshaller.unmarshal(xmlFile); // 编组操作 Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); jaxbMarshaller.marshal(entries, System.out);
3. Hobby标签文本值无法正确获取/编组为空的问题
这个问题是因为你没有正确映射Hobby标签的文本内容:XML里的<Hobby time="M">Novels</Hobby>中,"Novels"是元素的文本值,不是子元素,不能用@XmlElement,应该用@XmlValue注解。同时注意属性名的大小写匹配(XML里是time小写,你的注解里写的是"Time"大写,会导致属性映射失败)。
修改后的Hobby.java如下:
@Data @XmlAccessorType(XmlAccessType.FIELD) public class Hobby{ @XmlAttribute(name="time") // 改成小写time,和XML属性名严格一致 private String time; // 变量名建议用小写驼峰,符合Java编码规范 @XmlValue // 用这个注解映射元素的文本内容 private String hobbyContent; // 变量名可以更直观,比如hobbyContent }
同时建议把Student.java里的List<Hobby> Hobbies变量名改成hobbies(小写驼峰),避免因命名风格引发的潜在问题。
这样修改后,解组时就能正确获取Hobby的文本值,编组时也会生成带有文本内容的Hobby标签了。
内容的提问来源于stack exchange,提问作者Rakshan Premsagar Kapikad
相关产品推荐
相关产品推荐

