Eclipse Maven JDK11项目XStream提示未开放包导致字段无法访问报错如何解决
问题原因
你遇到的报错是Java 9+引入的JPMS(Java平台模块系统)的访问限制导致的,和你配置的alias别名无关:
XStream默认通过反射读取类的私有字段完成序列化,你的项目启用了模块系统,没有将存放实体类的modele包开放给xstream模块的反射访问权限,因此触发了权限异常。
解决方案
你可以根据自己的项目需求任选下面一种方案处理:
方案1:禁用模块系统(操作最简单)
如果你的项目不需要用到JPMS的模块特性,直接删除项目根目录下的module-info.java文件即可。JDK 11在没有检测到模块描述文件时,会自动降级为类路径运行模式,不会存在模块访问限制,修改后重新运行代码即可正常序列化。
方案2:保留模块系统,补充开放权限
如果你需要使用模块系统的特性,修改项目的module-info.java文件,添加对应的开放权限配置:
module archi { // 原有依赖声明保留,新增下面的配置 opens modele to xstream; // 后续如果需要序列化controlleur、vue包下的类,对应补充开放配置即可 // opens controlleur to xstream; // opens vue to xstream; }
模块问题解决后,你之前写的别名配置就可以正常生效,完整的XStream使用示例如下:
XStream xstream = new XStream(); // 配置别名 xstream.alias("ue", UE.class); xstream.alias("classe", Classe.class); xstream.alias("creneau", Creneau.class); // 配置允许序列化的类,避免XStream的安全告警 xstream.allowTypes(new Class[]{UE.class, Classe.class, Creneau.class}); String xml = xstream.toXML(ue); System.out.println(xml);
内容的提问来源于stack exchange,提问作者RamboSushi
相关产品推荐
相关产品推荐

