Spring集成OptaPlanner创建ScoreManager抛出IllegalStateException如何解决
排查步骤
检查@PlanningSolution注解导入是否正确
确认MySolution类导入的注解是org.optaplanner.core.api.domain.solution.PlanningSolution,排除导入其他同名自定义注解或第三方注解的可能。确认类加载器一致性(Spring环境高频诱因)
Spring Boot DevTools、OSGi等组件会引入多类加载器环境,OptaPlanner默认使用线程上下文类加载器加载配置中的类,和Spring加载MySolution的类加载器不一致时,就会出现注解存在但检测不到的问题。- 临时关闭Spring Boot DevTools重启测试,验证是否是DevTools导致的冲突
- 永久解决可以在创建SolverFactory时显式指定
MySolution对应的类加载器,修改代码如下:
SolverFactory<MySolution> solverFactory = SolverFactory.createFromXmlResource( "solver/myRosteringSolverConfig.xml", MySolution.class.getClassLoader() ); var scoreManager = ScoreManager.create(solverFactory);排除字节码增强/代理导致的注解丢失
如果MySolution被Spring AOP、动态代理等字节码增强逻辑修改,代理类可能没有保留原类的@PlanningSolution注解。可以添加测试代码验证:
// 输出true代表原类注解存在,问题出在OptaPlanner拿到的是代理类/其他类加载器的类 System.out.println(MySolution.class.isAnnotationPresent(PlanningSolution.class));
如果是代理导致的问题,可配置AOP的切面跳过规划解决方案类,或者调整代理策略保留类注解。
简化配置验证路径正确性
检查xml配置中solutionClass的全限定类名拼写、大小写是否完全匹配MySolution的实际路径,也可以直接删除xml中的<solutionClass>和<entityClass>配置项,OptaPlanner会自动扫描类路径下带对应注解的类,避免手动配置错误。检查依赖版本冲突
如果使用了spring-boot-starter-optaplanner,确认没有手动引入其他版本的OptaPlanner核心依赖,版本不兼容会导致注解扫描逻辑异常。
内容的提问来源于stack exchange,提问作者Cromm
相关产品推荐
相关产品推荐

