JDK17环境下使用XStream将ArrayList转XML文件时出现转换异常如何解决?
问题根因
- JDK 17作为高版本JDK,自带的模块系统对Java核心类库做了强封装限制,XStream默认使用反射转换器访问
java.util包下ArrayList等类的私有成员时没有权限,触发模块访问限制报错 - XStream未配置自定义类
istat.ArrayData、istat.Dati的序列化规则,找不到对应转换器
解决方案
方案1:仅添加JVM启动参数(无需修改代码)
在Eclipse中给运行项添加启动参数即可解决权限问题:
- 右键你的项目 -> 选择
Run As->Run Configurations - 找到你当前运行的
Running类对应的Java Application配置项 - 切换到
Arguments选项卡,在VM arguments输入框中添加以下参数:
--add-opens java.base/java.util=ALL-UNNAMED
- 点击
Apply保存后重新运行即可
方案2:修改XStream配置(推荐,无需改启动参数,兼容性更好)
直接修改arrayToXML方法的XStream配置,补充安全规则和转换规则即可:
public void arrayToXML() { XStream xstream = new XStream(new StaxDriver()); // 初始化默认安全配置 XStream.setupDefaultSecurity(xstream); // 允许XStream序列化你的自定义类 xstream.allowTypes(new Class[]{ArrayData.class, Dati.class}); // 给自定义类设置别名,生成的XML标签更简洁 xstream.alias("arrayData", ArrayData.class); xstream.alias("dati", Dati.class); // 如果ArrayData是继承自ArrayList的子类,指定用集合转换器处理 xstream.addDefaultImplementation(ArrayList.class, ArrayData.class); String xml = xstream.toXML(list); FileWriter fw = null; try { fw = new FileWriter(new File("ArrayList.xml")); fw.write(xml); }catch(Exception e) { e.printStackTrace(); } finally { // 补充资源关闭逻辑,避免资源泄漏 if (fw != null) { try { fw.close(); } catch (IOException e) { e.printStackTrace(); } } } }
补充注意事项
- 请将你的XStream依赖升级到1.4.20及以上稳定版本,旧版本对JDK17的兼容性差,可能仍会报错
- 若修改代码后仍有权限报错,可配合方案1的启动参数同时使用,即可完全解决问题
内容的提问来源于stack exchange,提问作者aNoob13
相关产品推荐
相关产品推荐

