OptaPlanner получил ошибку отражения Java при загрузке Spring - PullRequest
0 голосов
/ 02 октября 2018

Я только что попытался запустить проект 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

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Ответ Ника правильный.Это просто, чтобы выяснить, что происходит.

Эта строка означает, что optaplanner извлекает CloudBalance.getScore():

at org.optaplanner.core.impl.domain.solution.descriptor.SolutionDescriptor.getScore(SolutionDescriptor.java:1071)

Эта строка означает, что для этого используется ReflectionFieldMemberAccessor, чтоЭто просто способ прочитать поле с помощью отражения (включая приватные поля):

at org.optaplanner.core.impl.domain.common.accessor.ReflectionFieldMemberAccessor.executeGetter(ReflectionFieldMemberAccessor.java:54)

Теперь сообщение об ошибке становится тем, где оно становится интересным:

Can not set ...HardMediumSoftScore field ...CloudBalance.score to ...CloudBalance

Похоже, что в основном делает:

CloudBalance cloudBalance2 = cloudBalance.getScore();

А? 1017 *

0 голосов
/ 26 августа 2019

Муса предоставил этот ответ, но кто-то удалил его, несмотря на то, что ссылка JIRA чрезвычайно актуальна, поскольку в ней указывается, какая версия OptaPlanner лучше справится с этой проблемой:

"Проблема была отправлена ​​в OptaPlannerчтобы обеспечить лучшие сообщения об ошибках в таких случаях: https://issues.jboss.org/browse/PLANNER-1586. Не стесняйтесь добавлять любые комментарии или предложения. "

0 голосов
/ 02 октября 2018

Удаление зависимости spring-boot-devtools исправляет эту ошибку.Другой вопрос, похожий на этот, объясняет, что он имеет отношение к различным загрузчикам классов: Рабочая память Optaplanner Drools пуста .В принятом ответе также упоминается возможное исправление:

Чтобы исправить это, настройте инструменты Spring Dev для загрузки библиотек Drools в RestartClassLoader вместе с классами проекта: using-boot-devtools-customizing-класс загрузки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...