quarkusio / gizmo

Apache License 2.0
50 stars 40 forks source link

Error message : Exception does not have appropriate constructor #201

Closed seallijian closed 2 days ago

seallijian commented 4 days ago

I use gizmo 1.8.0 for my quarkus app, I can successfully debug my app in my local machine with mvn quarkus:dev, but after I package my app into quarkus native with mvn package -Pnative --define quarkus.native.container-build=true -DskipTests --define maven.compile.fork=true and publish it into my server, I got error message as Caused by: java.lang.IllegalArgumentException: Exception does not have appropriate constructor at io.quarkus.gizmo.BytecodeCreator.throwException(BytecodeCreator.java:888)

dmlloyd commented 3 days ago

If you're trying to use Gizmo to create classes at runtime, this is not going to work with native image, for two reasons. The first reason is that the constructor simply doesn't exist at run time (because native image didn't detect that it was reachable so it pruned it from the program graph via dead code elimination). The second reason is that defining classes at runtime is also forbidden by native image (since all known classes are compiled ahead of time).

If you're trying to do this at compile time then the issue is probably a bit more complex and I'd need to see a full stack trace to say for sure what's going on.

seallijian commented 2 days ago

My app is to use opta planner for realtime scheduling based on quarkus framework, the error occured when I call the method below:

public void startSolving(Schedule inputProblem,
            Consumer<Schedule> bestSolutionConsumer, Consumer<Throwable> errorHandler) {
                {
                    solverManager.solveAndListen(SINGLETON_ID, id -> inputProblem, bestSolution -> {
                        if (bestSolution.getScore().isSolutionInitialized()) {
                            bestSolutionConsumer.accept(bestSolution);
                            pinPlanOrderAssignedToWorkcenters(bestSolution.getPlanOrders());

                        }
                    }, (id, error) -> errorHandler.accept(error));   
                }

    }

the full stack trace is as below. as described, it seems that the error is from error handling code " (id, error) -> errorHandler.accept(error)); "

2024-09-16 22:20:16,269 ERROR [io.qua.ver.htt.run.QuarkusErrorHandler] (executor-thread-2) HTTP Request to /scheduling/solve failed, error id: 778c78c8-fb53-4dac-9754-33754f202a12-1: org.jboss.resteasy.spi.UnhandledException: java.lang.IllegalArgumentException: Exception does not have appropriate constructor
    at org.jboss.resteasy.core.ExceptionHandler.handleApplicationException(ExceptionHandler.java:107)
    at org.jboss.resteasy.core.ExceptionHandler.handleException(ExceptionHandler.java:344)
    at org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.java:205)
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:452)
    at org.jboss.resteasy.core.SynchronousDispatcher.lambda$invoke$4(SynchronousDispatcher.java:240)
    at org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:154)
    at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:321)
    at org.jboss.resteasy.core.SynchronousDispatcher.preprocess(SynchronousDispatcher.java:157)
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:229)
    at io.quarkus.resteasy.runtime.standalone.RequestDispatcher.service(RequestDispatcher.java:82)
    at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.dispatch(VertxRequestHandler.java:147)
    at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler$1.run(VertxRequestHandler.java:93)
    at io.quarkus.vertx.core.runtime.VertxCoreRecorder$14.runWith(VertxCoreRecorder.java:576)
    at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)
    at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)
    at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:29)
    at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:29)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.base@17.0.12/java.lang.Thread.run(Thread.java:840)
    at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:885)
    at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:860)
Caused by: java.lang.IllegalArgumentException: Exception does not have appropriate constructor
    at io.quarkus.gizmo.BytecodeCreator.throwException(BytecodeCreator.java:888)
    at org.optaplanner.core.impl.domain.common.accessor.gizmo.GizmoMemberAccessorImplementor.lambda$createConstructor$4(GizmoMemberAccessorImplementor.java:183)
    at org.optaplanner.core.impl.domain.common.accessor.gizmo.GizmoMethodHandler.whenIsMethod(GizmoMethodHandler.java:28)
    at org.optaplanner.core.impl.domain.common.accessor.gizmo.GizmoMemberDescriptor.whenMetadataIsOnMethod(GizmoMemberDescriptor.java:163)
    at org.optaplanner.core.impl.domain.common.accessor.gizmo.GizmoMemberAccessorImplementor.createConstructor(GizmoMemberAccessorImplementor.java:167)
    at org.optaplanner.core.impl.domain.common.accessor.gizmo.GizmoMemberAccessorImplementor.defineAccessorFor(GizmoMemberAccessorImplementor.java:57)
    at org.optaplanner.core.impl.domain.common.accessor.gizmo.GizmoMemberAccessorImplementor.createAccessorFor(GizmoMemberAccessorImplementor.java:108)
    at org.optaplanner.core.impl.domain.common.accessor.gizmo.GizmoMemberAccessorFactory.buildGizmoMemberAccessor(GizmoMemberAccessorFactory.java:40)
    at org.optaplanner.core.impl.domain.common.accessor.MemberAccessorFactory.buildMemberAccessor(MemberAccessorFactory.java:38)
    at org.optaplanner.core.impl.domain.common.accessor.MemberAccessorFactory.lambda$buildAndCacheMemberAccessor$0(MemberAccessorFactory.java:125)
    at java.base@17.0.12/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708)
    at org.optaplanner.core.impl.domain.common.accessor.MemberAccessorFactory.buildAndCacheMemberAccessor(MemberAccessorFactory.java:124)
    at org.optaplanner.core.impl.domain.entity.descriptor.EntityDescriptor.processPlanningVariableAnnotation(EntityDescriptor.java:239)
    at org.optaplanner.core.impl.domain.entity.descriptor.EntityDescriptor.processAnnotations(EntityDescriptor.java:154)
    at org.optaplanner.core.impl.domain.solution.descriptor.SolutionDescriptor.buildSolutionDescriptor(SolutionDescriptor.java:106)
    at org.optaplanner.core.impl.solver.DefaultSolverFactory.buildSolutionDescriptor(DefaultSolverFactory.java:147)
    at org.optaplanner.core.impl.solver.DefaultSolverFactory.<init>(DefaultSolverFactory.java:69)
    at org.optaplanner.core.api.solver.SolverFactory.create(SolverFactory.java:106)
    at org.optaplanner.quarkus.bean.DefaultOptaPlannerBeanProvider.solverFactory(DefaultOptaPlannerBeanProvider.java:46)
    at org.optaplanner.quarkus.bean.DefaultOptaPlannerBeanProvider_ProducerMethod_solverFactory_3b1fa4ff0a3de7781ba3e1239701086bba97ef14_Bean.doCreate(Unknown Source)
    at org.optaplanner.quarkus.bean.DefaultOptaPlannerBeanProvider_ProducerMethod_solverFactory_3b1fa4ff0a3de7781ba3e1239701086bba97ef14_Bean.create(Unknown Source)
    at org.optaplanner.quarkus.bean.DefaultOptaPlannerBeanProvider_ProducerMethod_solverFactory_3b1fa4ff0a3de7781ba3e1239701086bba97ef14_Bean.get(Unknown Source)
    at org.optaplanner.quarkus.bean.DefaultOptaPlannerBeanProvider_ProducerMethod_solverFactory_3b1fa4ff0a3de7781ba3e1239701086bba97ef14_Bean.get(Unknown Source)
    at org.optaplanner.quarkus.bean.DefaultOptaPlannerBeanProvider_ProducerMethod_solverManager_d6636211e93ca3985f0495d972987bdadf803f37_Bean.doCreate(Unknown Source)
    at org.optaplanner.quarkus.bean.DefaultOptaPlannerBeanProvider_ProducerMethod_solverManager_d6636211e93ca3985f0495d972987bdadf803f37_Bean.create(Unknown Source)
    at org.optaplanner.quarkus.bean.DefaultOptaPlannerBeanProvider_ProducerMethod_solverManager_d6636211e93ca3985f0495d972987bdadf803f37_Bean.get(Unknown Source)
    at org.optaplanner.quarkus.bean.DefaultOptaPlannerBeanProvider_ProducerMethod_solverManager_d6636211e93ca3985f0495d972987bdadf803f37_Bean.get(Unknown Source)
    at org.acme.callcenter.service.SolverService_Bean.doCreate(Unknown Source)
    at org.acme.callcenter.service.SolverService_Bean.create(Unknown Source)
    at org.acme.callcenter.service.SolverService_Bean.create(Unknown Source)
    at io.quarkus.arc.impl.AbstractSharedContext.createInstanceHandle(AbstractSharedContext.java:113)
    at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:37)
    at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:34)
    at io.quarkus.arc.impl.LazyValue.get(LazyValue.java:26)
    at io.quarkus.arc.impl.ComputingCache.computeIfAbsent(ComputingCache.java:69)
    at io.quarkus.arc.impl.AbstractSharedContext.get(AbstractSharedContext.java:34)
    at io.quarkus.arc.impl.ClientProxies.getApplicationScopedDelegate(ClientProxies.java:21)
    at org.acme.callcenter.service.SolverService_ClientProxy.arc$delegate(Unknown Source)
    at org.acme.callcenter.service.SolverService_ClientProxy.startSolving(Unknown Source)
    at org.acme.callcenter.rest.ScheduleResource.solve(ScheduleResource.java:60)
    at java.base@17.0.12/java.lang.reflect.Method.invoke(Method.java:569)
    at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:154)
    at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:118)
    at org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:560)
    at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter(ResourceMethodInvoker.java:452)
    at org.jboss.resteasy.core.ResourceMethodInvoker.lambda$invokeOnTarget$2(ResourceMethodInvoker.java:413)
    at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:321)
    at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:415)
    at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:378)
    at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:356)
    at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:70)
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:429)
    ... 17 more
dmlloyd commented 2 days ago

This looks like a problem with the OptaPlanner extension, so I would direct your inquiry in that direction. Since native image does not support class loading, use of Gizmo at run time for native images is not supported.