Я только что попытался запустить проект OptaPlanner в Spring Boot, но в Руководстве пользователя OptaPlanner для Spring есть только очень простой текст.
На самом деле, я думаю, что очень легко скопировать все объекты домена, файлы конфигурации и файлы сносок из проекта OptaPlanner в проект Spring Boot без каких-либо изменений, но единственный вопрос заключается в том, как вызвать Solver
.solve
метод.
Я запустил его после запуска Spring Boot с классом (с именем CommandLineAppStartupRunner
), который реализует интерфейс CommandLineRunner
, и я вызвал метод solve
в его методе run
.Наконец, я получил следующее исключение:
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
Я проверил код и обнаружил, что выбрасывает исключение, потому что объект из field.getDeclaringClass()
отличается от экземпляра из var1.getClass()
.Боюсь, это из-за реализации конфликтов отражения java между OptaPlanner и Spring Boot.
Я использовал следующую версию:
- OptaPlanner 7.11.0.Final
- Spring Boot 2.0.5.RELEASE
- JVM 1.8.0_181