quarkus: [2.12.0.CR1]: `/q/dev` UI throws an error when navigating to "Configuration" -> "Config Editor", and "Devservices" is empty

Describe the bug

  1. Starting here:

image

  1. Click Config Editor, see this:
CLICK TO VIEW STACKTRACE
java.lang.StringIndexOutOfBoundsException: begin 1, end 0, length 1
	at java.base/java.lang.String.checkBoundsBeginEnd(String.java:4604)
	at java.base/java.lang.String.substring(String.java:2707)
	at io.quarkus.vertx.http.runtime.devmode.ConfigDescriptionsManager.calculate(ConfigDescriptionsManager.java:100)
	at io.quarkus.vertx.http.runtime.devmode.ConfigDescriptionsManager.values(ConfigDescriptionsManager.java:59)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at io.quarkus.qute.GetterAccessor.getValue(GetterAccessor.java:22)
	at io.quarkus.qute.ReflectionValueResolver.resolve(ReflectionValueResolver.java:59)
	at io.quarkus.qute.EvaluatorImpl.resolve(EvaluatorImpl.java:207)
	at io.quarkus.qute.EvaluatorImpl.resolveReference(EvaluatorImpl.java:127)
	at io.quarkus.qute.EvaluatorImpl.lambda$evaluate$0(EvaluatorImpl.java:74)
	at io.quarkus.qute.CompletedStage.thenCompose(CompletedStage.java:232)
	at io.quarkus.qute.EvaluatorImpl.evaluate(EvaluatorImpl.java:72)
	at io.quarkus.qute.ResolutionContextImpl$ChildResolutionContext.evaluate(ResolutionContextImpl.java:87)
	at io.quarkus.qute.LoopSectionHelper.resolve(LoopSectionHelper.java:44)
	at io.quarkus.qute.SectionNode.resolve(SectionNode.java:48)
	at io.quarkus.qute.SectionNode$SectionResolutionContextImpl.execute(SectionNode.java:182)
	at io.quarkus.qute.InsertSectionHelper.resolve(InsertSectionHelper.java:20)
	at io.quarkus.qute.SectionNode.resolve(SectionNode.java:48)
	at io.quarkus.qute.SectionNode$SectionResolutionContextImpl.execute(SectionNode.java:182)
	at io.quarkus.qute.SectionHelper$SectionResolutionContext.execute(SectionHelper.java:46)
	at io.quarkus.qute.Parser$1.resolve(Parser.java:1230)
	at io.quarkus.qute.SectionNode.resolve(SectionNode.java:48)
	at io.quarkus.qute.IncludeSectionHelper.lambda$resolve$1(IncludeSectionHelper.java:63)
	at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863)
	at java.base/java.util.concurrent.CompletableFuture.uniWhenCompleteStage(CompletableFuture.java:887)
	at java.base/java.util.concurrent.CompletableFuture.whenComplete(CompletableFuture.java:2325)
	at java.base/java.util.concurrent.CompletableFuture.whenComplete(CompletableFuture.java:144)
	at io.quarkus.qute.IncludeSectionHelper.resolve(IncludeSectionHelper.java:47)
	at io.quarkus.qute.SectionNode.resolve(SectionNode.java:48)
	at io.quarkus.qute.SectionNode$SectionResolutionContextImpl.execute(SectionNode.java:178)
	at io.quarkus.qute.SectionHelper$SectionResolutionContext.execute(SectionHelper.java:46)
	at io.quarkus.qute.Parser$1.resolve(Parser.java:1230)
	at io.quarkus.qute.SectionNode.resolve(SectionNode.java:48)
	at io.quarkus.qute.TemplateImpl$TemplateInstanceImpl.renderData(TemplateImpl.java:176)
	at io.quarkus.qute.TemplateImpl$TemplateInstanceImpl.renderAsyncNoTimeout(TemplateImpl.java:167)
	at io.quarkus.qute.TemplateImpl$TemplateInstanceImpl.renderAsync(TemplateImpl.java:140)
	at io.quarkus.vertx.http.deployment.devmode.console.DevConsole.renderTemplate(DevConsole.java:173)
	at io.quarkus.vertx.http.deployment.devmode.console.DevConsole.handle(DevConsole.java:137)
	at io.quarkus.vertx.http.deployment.devmode.console.DevConsole.handle(DevConsole.java:39)
	at io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1284)
	at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:173)
	at io.vertx.ext.web.impl.RoutingContextWrapper.next(RoutingContextWrapper.java:200)
	at io.quarkus.vertx.http.deployment.devmode.console.FlashScopeHandler.handle(FlashScopeHandler.java:12)
	at io.quarkus.vertx.http.deployment.devmode.console.FlashScopeHandler.handle(FlashScopeHandler.java:7)
	at io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1284)
	at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:173)
	at io.vertx.ext.web.impl.RoutingContextWrapper.next(RoutingContextWrapper.java:200)
	at io.vertx.ext.web.impl.RouterImpl.handleContext(RouterImpl.java:250)
	at io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1284)
	at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:173)
	at io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:140)
	at io.vertx.ext.web.impl.RouterImpl.handle(RouterImpl.java:68)
	at io.vertx.ext.web.impl.RouterImpl.handle(RouterImpl.java:37)
	at io.quarkus.vertx.http.deployment.devmode.console.DevConsoleProcessor$2$1.handle(DevConsoleProcessor.java:193)
	at io.quarkus.vertx.http.deployment.devmode.console.DevConsoleProcessor$2$1.handle(DevConsoleProcessor.java:190)
	at io.vertx.core.impl.EventLoopContext.emit(EventLoopContext.java:55)
	at io.vertx.core.impl.EventLoopContext.lambda$emit$1(EventLoopContext.java:62)
	at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:503)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at java.base/java.lang.Thread.run(Thread.java:833)
Resulted in: java.lang.reflect.InvocationTargetException
	... 64 more
Resulted in: java.lang.IllegalStateException: Reflection invocation error
	at io.quarkus.qute.GetterAccessor.getValue(GetterAccessor.java:29)
	... 59 more
Resulted in: io.quarkus.qute.TemplateException
	at io.quarkus.qute.CompletedStage.get(CompletedStage.java:48)
	at io.quarkus.qute.MultiResultNode.process(MultiResultNode.java:20)
	at io.quarkus.qute.MultiResultNode.process(MultiResultNode.java:20)
	at io.quarkus.qute.TemplateImpl$TemplateInstanceImpl.lambda$renderData$5(TemplateImpl.java:182)
	at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863)
	at java.base/java.util.concurrent.CompletableFuture.uniWhenCompleteStage(CompletableFuture.java:887)
	at java.base/java.util.concurrent.CompletableFuture.whenComplete(CompletableFuture.java:2325)
	at java.base/java.util.concurrent.CompletableFuture.whenComplete(CompletableFuture.java:144)
	... 32 more
Resulted in: java.util.concurrent.CompletionException: io.quarkus.qute.TemplateException
	at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:332)
	at java.base/java.util.concurrent.CompletableFuture.uniApplyNow(CompletableFuture.java:674)
	at java.base/java.util.concurrent.CompletableFuture.uniApplyStage(CompletableFuture.java:662)
	at java.base/java.util.concurrent.CompletableFuture.thenApply(CompletableFuture.java:2168)
	at java.base/java.util.concurrent.CompletableFuture.thenApply(CompletableFuture.java:144)
	... 31 more

image

  1. Click Dev Services, receive empty page:

image

Expected behavior

No response

Actual behavior

No response

How to Reproduce?

Here are the Quarkus-related deps:

dependencies {
    implementation(platform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}"))
    implementation("io.quarkus:quarkus-agroal")
    implementation("io.quarkus:quarkus-arc")
    implementation("io.quarkus:quarkus-cache")
    implementation("io.quarkus:quarkus-container-image-docker")
    implementation("io.quarkus:quarkus-kotlin")
    implementation("io.quarkus:quarkus-reactive-routes")
    implementation("io.quarkus:quarkus-resteasy-reactive")
    implementation("io.quarkus:quarkus-resteasy-reactive-jackson")
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.13.3")
    implementation("io.quarkus:quarkus-smallrye-fault-tolerance")
    implementation("io.quarkus:quarkus-smallrye-openapi")
    implementation("io.quarkus:quarkus-smallrye-opentracing")
    implementation("io.quarkus:quarkus-vertx")
    implementation("io.quarkus:quarkus-vertx-graphql")
    implementation("io.quarkiverse.loggingmanager:quarkus-logging-manager:2.1.4")
    implementation("io.opentracing.contrib:opentracing-jdbc")
    listOf("h2", "mariadb", "mssql", "mysql", "oracle", "postgresql").forEach {
        implementation("io.quarkus:quarkus-jdbc-${it}")
    }
}

Output of uname -a or ver

No response

Output of java -version

17

GraalVM version (if different from Java)

No response

Quarkus version or git rev

2.12.0.CR1

Build tool (ie. output of mvnw --version or gradlew --version)

No response

Additional information

No response

About this issue

  • Original URL
  • State: closed
  • Created 2 years ago
  • Comments: 22 (21 by maintainers)

Most upvoted comments

Ok I think I found a case where this happens. See PR #27490 for a fix. @GavinRay97 if you can test against this PR that would be great. Basically if you have a quoted dot this error happens, example a config like bla.bla."."=foo will create this error.

The empty page in DevService is when there are no dev services. I’ll do a PR to either add some info there, or remove the button)

@phillip-kruger could you have a look now that we have a reproducer? ^