ClassCastException 发生在 Solver.solve
ClassCastException occured on Solver.solve
我正在修改 optaplanner-webexamples vrp。
所以我有点使用 spring-boot ,我编辑了一些模型等
但是当 运行 解决它时在 VehicleRoutingSolution class
上产生 ClassCastException
java.lang.ClassCastException: id.co.asyst.vrp.core.solution.VehicleRoutingSolution cannot be cast to id.co.asyst.vrp.core.solution.VehicleRoutingSolution
at org.optaplanner.core.impl.domain.common.accessor.LambdaBeanPropertyMemberAccessor.executeGetter(LambdaBeanPropertyMemberAccessor.java:120)
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 id.co.asyst.vrp.rest.cdi.VehicleRoutingSolverManager.lambda$solve(VehicleRoutingSolverManager.java:105)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)
at java.util.concurrent.FutureTask.run(FutureTask.java)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
我哪里做错了?
我直接从 optaplanner-webexamples 中获取的大部分代码对模型进行了少量修改。大多数只是 table 关系。
非常感谢。
查看我的回答here了解更多详情。您必须检查重复出现的位置:
System.out.println(TheGhostClass.class.getProtectionDomain().getCodeSource().getLocation());
原来是因为spring-boot-devtools。在我将其从 pom.xml
中删除后,它运行良好
另一个不需要放弃 spring-boot-devtools
的解决方案是 "promote" optaplanner-core
JAR 到属于 spring-boot-devtools
的 "restart" 类加载器。这可以通过使用以下内容创建 src/main/resources/META-INF/spring-devtools.properties
来实现:
restart.include.optaplanner=/optaplanner-core.*jar
我想到的最佳解决方案是使用 Spring Boot docs 中推荐的上下文类加载器。使用上下文类加载器作为 SolverFactory.createFromXmlResource()
的第二个参数。例如:
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
SolverFactory<VehicleRoutingSolution> sf = SolverFactory.createFromXmlResource(
"org/optaplanner/examples/vehiclerouting/solver/vehicleRoutingSolverConfig.xml",
classLoader
);
如我之前的回答一样,这与开发人员工具一起使用,因此您可以在 POM 中保留 spring-boot-devtools
并继续使用 Automatic Restart 功能。
我正在修改 optaplanner-webexamples vrp。 所以我有点使用 spring-boot ,我编辑了一些模型等
但是当 运行 解决它时在 VehicleRoutingSolution class
上产生 ClassCastExceptionjava.lang.ClassCastException: id.co.asyst.vrp.core.solution.VehicleRoutingSolution cannot be cast to id.co.asyst.vrp.core.solution.VehicleRoutingSolution
at org.optaplanner.core.impl.domain.common.accessor.LambdaBeanPropertyMemberAccessor.executeGetter(LambdaBeanPropertyMemberAccessor.java:120)
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 id.co.asyst.vrp.rest.cdi.VehicleRoutingSolverManager.lambda$solve(VehicleRoutingSolverManager.java:105)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)
at java.util.concurrent.FutureTask.run(FutureTask.java)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
我哪里做错了? 我直接从 optaplanner-webexamples 中获取的大部分代码对模型进行了少量修改。大多数只是 table 关系。
非常感谢。
查看我的回答here了解更多详情。您必须检查重复出现的位置:
System.out.println(TheGhostClass.class.getProtectionDomain().getCodeSource().getLocation());
原来是因为spring-boot-devtools。在我将其从 pom.xml
中删除后,它运行良好
另一个不需要放弃 spring-boot-devtools
的解决方案是 "promote" optaplanner-core
JAR 到属于 spring-boot-devtools
的 "restart" 类加载器。这可以通过使用以下内容创建 src/main/resources/META-INF/spring-devtools.properties
来实现:
restart.include.optaplanner=/optaplanner-core.*jar
我想到的最佳解决方案是使用 Spring Boot docs 中推荐的上下文类加载器。使用上下文类加载器作为 SolverFactory.createFromXmlResource()
的第二个参数。例如:
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
SolverFactory<VehicleRoutingSolution> sf = SolverFactory.createFromXmlResource(
"org/optaplanner/examples/vehiclerouting/solver/vehicleRoutingSolverConfig.xml",
classLoader
);
如我之前的回答一样,这与开发人员工具一起使用,因此您可以在 POM 中保留 spring-boot-devtools
并继续使用 Automatic Restart 功能。