Quarkus: Qute collection access requires restart of quarkus:dev

Created on 31 Mar 2020  路  3Comments  路  Source: quarkusio/quarkus

Describe the bug
When coding Qute templates in quarkus:dev, the first time we access a list.get(index) fails with a java.lang.ClassNotFoundException: io.quarkus.qute.runtime.extensions.CollectionTemplateExtensions_Extension_ValueResolver_get_646e8480881185b6bc78b6698eeafb5d7b01c85c$$function$$2

Once we restart quarkus:dev and then the resolver is "known" once, it works as expected (even we remove the access and add it again).

Reproducer

  1. Start quarkus:dev with an empty template
  2. Add a template that accesses a list, similar to this:
    {#if ! entries.isEmpty} First title: {entries.get(0).title} {/}
  3. It fails with:
    java.lang.NoClassDefFoundError: io.quarkus.qute.runtime.extensions.CollectionTemplateExtensions_Extension_ValueResolver_get_646e8480881185b6bc78b6698eeafb5d7b01c85c$$function$$2 at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:314) at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1190) at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2299) at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:143) at io.quarkus.qute.EvaluatorImpl.resolveReference(EvaluatorImpl.java:76) at io.quarkus.qute.EvaluatorImpl.evaluate(EvaluatorImpl.java:48) at io.quarkus.qute.ResolutionContextImpl.evaluate(ResolutionContextImpl.java:31) at io.quarkus.qute.ExpressionNode.resolve(ExpressionNode.java:25) at io.quarkus.qute.SectionNode$SectionResolutionContextImpl.execute(SectionNode.java:126) at io.quarkus.qute.IfSectionHelper.lambda$resolveCondition$0(IfSectionHelper.java:55) at io.quarkus.qute.IfSectionHelper$$Lambda$844/0000000000000000.apply(Unknown Source) at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1183) at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2299) at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:143) at io.quarkus.qute.IfSectionHelper.resolveCondition(IfSectionHelper.java:53) at io.quarkus.qute.IfSectionHelper.resolve(IfSectionHelper.java:43) at io.quarkus.qute.SectionNode.resolve(SectionNode.java:34) at io.quarkus.qute.SectionNode$SectionResolutionContextImpl.execute(SectionNode.java:126) at io.quarkus.qute.SectionHelper$SectionResolutionContext.execute(SectionHelper.java:33) at io.quarkus.qute.Parser$1$1.resolve(Parser.java:80) at io.quarkus.qute.SectionNode.resolve(SectionNode.java:34) at io.quarkus.qute.TemplateImpl.renderData(TemplateImpl.java:99) at io.quarkus.qute.TemplateImpl.access$200(TemplateImpl.java:14) at io.quarkus.qute.TemplateImpl$TemplateInstanceImpl.renderAsync(TemplateImpl.java:80) at io.quarkus.resteasy.qute.runtime.TemplateResponseFilter.filter(TemplateResponseFilter.java:58) at org.jboss.resteasy.core.interception.jaxrs.ContainerResponseContextImpl.filter(ContainerResponseContextImpl.java:360) at org.jboss.resteasy.core.ServerResponseWriter.executeFilters(ServerResponseWriter.java:251) at org.jboss.resteasy.core.ServerResponseWriter.writeNomapResponse(ServerResponseWriter.java:101) at org.jboss.resteasy.core.ServerResponseWriter.writeNomapResponse(ServerResponseWriter.java:74) at org.jboss.resteasy.core.SynchronousDispatcher.writeResponse(SynchronousDispatcher.java:590) ... 58 more Caused by: java.lang.NoClassDefFoundError: io.quarkus.qute.runtime.extensions.CollectionTemplateExtensions_Extension_ValueResolver_get_646e8480881185b6bc78b6698eeafb5d7b01c85c$$function$$2 at io.quarkus.qute.runtime.extensions.CollectionTemplateExtensions_Extension_ValueResolver_get_646e8480881185b6bc78b6698eeafb5d7b01c85c.resolve(CollectionTemplateExtensions_Extension_ValueResolver_get_646e8480881185b6bc78b6698eeafb5d7b01c85c.zig:70) at io.quarkus.qute.EvaluatorImpl.resolve(EvaluatorImpl.java:100) at io.quarkus.qute.EvaluatorImpl.resolve(EvaluatorImpl.java:109) at io.quarkus.qute.EvaluatorImpl.resolve(EvaluatorImpl.java:109) at io.quarkus.qute.EvaluatorImpl.resolve(EvaluatorImpl.java:109) at io.quarkus.qute.EvaluatorImpl.resolve(EvaluatorImpl.java:109) at io.quarkus.qute.EvaluatorImpl.resolve(EvaluatorImpl.java:109) at io.quarkus.qute.EvaluatorImpl.resolve(EvaluatorImpl.java:109) at io.quarkus.qute.EvaluatorImpl.resolveReference(EvaluatorImpl.java:75) at io.quarkus.qute.EvaluatorImpl.lambda$resolveReference$1(EvaluatorImpl.java:78) at io.quarkus.qute.EvaluatorImpl$$Lambda$904/0000000000000000.apply(Unknown Source) at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1183) ... 86 more Caused by: java.lang.ClassNotFoundException: io.quarkus.qute.runtime.extensions.CollectionTemplateExtensions_Extension_ValueResolver_get_646e8480881185b6bc78b6698eeafb5d7b01c85c$$function$$2 at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:788) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:1081) at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:318) at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:274) ... 98 more
  4. If we stop and restart quarkus:dev, it works.

Btw, in the same case (empty template when starting then adding the code only once quarkus:dev is running) list[index] doesn't fail with an error but silently returns no element:

{#if ! entries.isEmpty}
    Entries has {entries.size} elements
    First title: {entries[0].title}
{/}
<!-- output -->
Entries has 3 elements
First title: NOT_FOUND

Tested with Quarkus version 1.3.1.Final.

arequte kinbug

Most helpful comment

I could not reproduce this, but I think I have a fix.

All 3 comments

/cc @mkouba

That's really odd. I was able to reproduce this issue with the qute quickstart but only once.

Steps:

  1. mvn clean
  2. mvn quarkus:dev
  3. Open http://localhost:8080/items -> OK
  4. add {items.get(0)} to the src/main/resources/templates/items.html file.
  5. Reload the browser -> NCDF for CollectionTemplateExtensions_Extension_ValueResolver_get_646e8480881185b6bc78b6698eeafb5d7b01c85c$$function$$2 (that's a function class generated by gizmo)

@stuartwdouglas could it be some intermittent class loading issue?

I could not reproduce this, but I think I have a fix.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

MossabTN picture MossabTN  路  3Comments

blsouthr picture blsouthr  路  3Comments

gastaldi picture gastaldi  路  3Comments

rodrigofujioka picture rodrigofujioka  路  3Comments

nderwin picture nderwin  路  3Comments