You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring集成OptaPlanner创建ScoreManager抛出IllegalStateException如何解决

排查步骤

  • 检查@PlanningSolution注解导入是否正确
    确认MySolution类导入的注解是org.optaplanner.core.api.domain.solution.PlanningSolution,排除导入其他同名自定义注解或第三方注解的可能。

  • 确认类加载器一致性(Spring环境高频诱因)
    Spring Boot DevTools、OSGi等组件会引入多类加载器环境,OptaPlanner默认使用线程上下文类加载器加载配置中的类,和Spring加载MySolution的类加载器不一致时,就会出现注解存在但检测不到的问题。

    1. 临时关闭Spring Boot DevTools重启测试,验证是否是DevTools导致的冲突
    2. 永久解决可以在创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 12:54:03