jesque icon indicating copy to clipboard operation
jesque copied to clipboard

NoSuchConstructorException

Open e7 opened this issue 4 years ago • 1 comments

net.greghaines.jesque.utils.NoSuchConstructorException: class=com.xxx.xxx.xxxx.TestAction args=[6]
	at net.greghaines.jesque.utils.ReflectionUtils.findConstructor(ReflectionUtils.java:205) ~[jesque-2.1.3.jar:na]
	at net.greghaines.jesque.utils.ReflectionUtils.createObject(ReflectionUtils.java:147) ~[jesque-2.1.3.jar:na]
	at net.greghaines.jesque.utils.JesqueUtils.materializeJob(JesqueUtils.java:415) ~[jesque-2.1.3.jar:na]
	at net.greghaines.jesque.worker.MapBasedJobFactory.materializeJob(MapBasedJobFactory.java:49) ~[jesque-2.1.3.jar:na]
	at net.greghaines.jesque.worker.WorkerImpl.process(WorkerImpl.java:605) [jesque-2.1.3.jar:na]
	at net.greghaines.jesque.worker.WorkerImpl.poll(WorkerImpl.java:449) [jesque-2.1.3.jar:na]
	at net.greghaines.jesque.worker.WorkerImpl.run(WorkerImpl.java:220) [jesque-2.1.3.jar:na]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_221]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_221]
	at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_221]

There is a public TestAction(long id); constructor there actually, so I track code into net.greghaines.jesque.utils.ReflectionUtils.findConstructor, and found this:

            if (typeDiffWeight < minTypeDiffWeight) { // right here, should be `<=` ?
                // Choose this constructor if it represents the closest match.
                constructorToUse = candidate;
                minTypeDiffWeight = typeDiffWeight;
                ambiguousConstructors = null;
            } else if (constructorToUse != null && typeDiffWeight == minTypeDiffWeight) {
                if (ambiguousConstructors == null) {
                    ambiguousConstructors = new LinkedHashSet<Constructor<?>>();
                    ambiguousConstructors.add(constructorToUse);
                }
                ambiguousConstructors.add(candidate);
            }

e7 avatar Jun 24 '20 07:06 e7

I ran into the same problem. This is because, it appears that Jesque is treating the argument as an int and looking for a constructor matching it, (in this case I could match it to a constructor with int as an argument type). I was able to work around the problem by making the constructor use java.lang.Number as constructor argument type and using longValue method to assign the class member.

lrajlich avatar Jul 10 '20 16:07 lrajlich