我只是试图在Spring Boot中运行一个OptaPlanner项目,但是在《 Spring OptaPlanner用户指南》中只有非常简单的文字。
实际上,我认为将所有域对象,配置文件和Drools文件从OptaPlanner项目复制到Spring Boot项目非常容易,而无需任何更改,但是唯一的问题是如何调用Solver
的solve
方法。
我在Spring Boot启动后使用CommandLineAppStartupRunner
实现CommandLineRunner
接口的类(名为)使它运行,然后solve
在其run
方法中调用method。最后,我得到如下异常:
Caused by: java.lang.IllegalArgumentException: Can not set org.optaplanner.core.api.score.buildin.hardmediumsoft.HardMediumSoftScore field springbootcloudbalance.domain.CloudBalance.score to springbootcloudbalance.domain.CloudBalance
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36)
at java.lang.reflect.Field.get(Field.java:393)
at org.optaplanner.core.impl.domain.common.accessor.ReflectionFieldMemberAccessor.executeGetter(ReflectionFieldMemberAccessor.java:54)
at org.optaplanner.core.impl.domain.solution.descriptor.SolutionDescriptor.getScore(SolutionDescriptor.java:1071)
at org.optaplanner.core.impl.score.director.AbstractScoreDirector.cloneSolution(AbstractScoreDirector.java:212)
at org.optaplanner.core.impl.solver.scope.DefaultSolverScope.setWorkingSolutionFromBestSolution(DefaultSolverScope.java:230)
at org.optaplanner.core.impl.solver.AbstractSolver.solvingStarted(AbstractSolver.java:75)
at org.optaplanner.core.impl.solver.DefaultSolver.solvingStarted(DefaultSolver.java:210)
at org.optaplanner.core.impl.solver.DefaultSolver.solve(DefaultSolver.java:190)
at springbootcloudbalance.CommandLineAppStartupRunner.run(CommandLineAppStartupRunner.java:55)
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:818)
... 10 common frames omitted
我检查了代码,发现抛出异常是因为from的对象与from的对象field.getDeclaringClass()
是不同的实例var1.getClass()
。恐怕是由于OptaPlanner和Spring Boot之间的java反射冲突的实现所致。
我使用的版本如下:
删除spring-boot-devtools依赖项可以修复此错误。与此类似的另一个SO问题解释了它与不同的类加载器有关:Optaplanner的Drools工作内存为空。接受的答案还提到了可能的解决方法:
要修复它,请配置spring dev工具以将Reools库以及项目的类一起加载到RestartClassLoader中:using-boot-devtools-customizing-classload
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句