升级OptaPlanner后自定义Forager触发XStream ForbiddenClassException问题
解决OptaPlanner升级后自定义ForagerConfig的XStream权限问题
我之前碰到过一模一样的问题,这是OptaPlanner从7.1.0版本开始引入的XStream安全加固导致的——正是为了修复PLANNER-896提到的反序列化漏洞,OptaPlanner默认收紧了XStream能反序列化的类范围,你的自定义MyCustomForagerConfig不在默认白名单里,所以抛出了ForbiddenClassException。升级到7.5.0没解决是因为这个安全机制在7.1.0之后一直保留,并没有自动将用户自定义配置类加入白名单。
下面是几个可行的解决方案:
1. 手动将自定义配置类加入XStream白名单
在创建SolverFactory之后,获取其XStream实例并显式允许你的自定义类,代码示例如下:
// 加载你的求解器配置 SolverFactory<YourSolutionClass> solverFactory = SolverFactory.createFromXmlResource("path/to/your/solverConfig.xml"); // 获取XStream实例并添加白名单 XStream xStream = solverFactory.getXStream(); xStream.allowTypes(new Class[]{com.mycompany.MyCustomForagerConfig.class}); // 后续正常创建Solver即可 Solver<YourSolutionClass> solver = solverFactory.buildSolver();
2. 确认自定义配置类的继承关系
确保MyCustomForagerConfig正确继承了OptaPlanner的LocalSearchForagerConfig类,因为OptaPlanner的配置类体系有严格的层级要求,如果继承关系不对,XStream在反序列化时会更难识别,也容易触发权限拦截。
3. 升级到7.6.0及以上版本
后续的OptaPlanner版本(7.6.0+)针对自定义配置类的权限问题做了优化,不仅加固了安全机制,还提供了更便捷的方式来注册自定义类。如果你能升级到这些版本,可能只需要少量配置就能解决问题,不过还是建议先尝试第一种手动添加白名单的方式,更直接高效。
另外要注意:如果你是通过Spring集成OptaPlanner,也需要在Spring的XStream配置中添加对应的白名单规则,原理和上面的代码方式一致。
内容的提问来源于stack exchange,提问作者Stefano Cappugi
相关产品推荐
相关产品推荐

