Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

No menu items in Hilla app when running as native compiled image #2395

Closed
Tracked by #5012
rbrki07 opened this issue May 7, 2024 · 3 comments · Fixed by #2396
Closed
Tracked by #5012

No menu items in Hilla app when running as native compiled image #2395

rbrki07 opened this issue May 7, 2024 · 3 comments · Fixed by #2396
Labels
bug Something isn't working hilla Issues related to Hilla Impact: High Severity: Blocker

Comments

@rbrki07
Copy link
Contributor

rbrki07 commented May 7, 2024

Describe the bug

A Hilla application that was compiled into a native image using GraalVM does not show any menu items:
grafik

Expected-behavior

The Hilla application should display menu items:
grafik

Reproduction

Create a new Hilla project:

npx @hilla/cli@latest init --next native-image-test

Compile Hilla application into a native image:

mvn clean package -Pproduction -Pnative native:compile

Start the application

./target/native-image-test

System Info

Hilla: 24.4.0.beta1
Hilla CLI: 2.0.1
Java: 21.0.2 (OpenJDK Runtime Environment GraalVM CE 21.0.2+13.1 - build 21.0.2+13-jvmci-23.1-b30)
OS: macOS Sonoma 14.4.1 (23E224)

@rbrki07 rbrki07 added bug Something isn't working hilla Issues related to Hilla labels May 7, 2024
@taefi
Copy link
Contributor

taefi commented May 7, 2024

Thanks @rbrki07 for reporting this issue.
It is probably due to the fact that it doesn't have any hints about the existence of META-INF/VAADIN/file-routes.json when the image is getting built.

@rbrki07
Copy link
Contributor Author

rbrki07 commented May 7, 2024

I can share this stack trace:

2024-05-07T15:25:17.258+02:00  WARN 88682 --- [           main] c.v.hilla.route.ClientRouteRegistry      : Failed load file-routes.json from /META-INF/VAADIN/file-routes.json

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.vaadin.hilla.route.records.ClientViewConfig`: cannot deserialize from Object value (no delegate- or property-based Creator): this appears to be a native image, in which case you may need to configure reflection for the class that is to be deserialized
 at [Source: (ByteArrayInputStream); line: 1, column: 3] (through reference chain: java.util.ArrayList[0])
        at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1915) ~[native-image-test:2.15.4]
        at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:414) ~[native-image-test:2.15.4]
        at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1355) ~[native-image-test:2.15.4]
        at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1431) ~[native-image-test:2.15.4]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:352) ~[native-image-test:2.15.4]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:185) ~[native-image-test:2.15.4]
        at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer._deserializeFromArray(CollectionDeserializer.java:359) ~[native-image-test:2.15.4]
        at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:244) ~[native-image-test:2.15.4]
        at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:28) ~[native-image-test:2.15.4]
        at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323) ~[native-image-test:2.15.4]
        at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4825) ~[native-image-test:2.15.4]
        at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3817) ~[native-image-test:2.15.4]
        at com.vaadin.hilla.route.ClientRouteRegistry.registerClientRoutes(ClientRouteRegistry.java:161) ~[native-image-test:na]
        at com.vaadin.hilla.startup.RouteUnifyingServiceInitListener.serviceInit(RouteUnifyingServiceInitListener.java:101) ~[native-image-test:na]
        at com.vaadin.flow.server.VaadinService.lambda$init$0(VaadinService.java:236) ~[native-image-test:24.4.0.beta1]
        at java.base@21.0.2/java.util.Iterator.forEachRemaining(Iterator.java:133) ~[native-image-test:na]
        at java.base@21.0.2/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1939) ~[na:na]
        at java.base@21.0.2/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:735) ~[native-image-test:na]
        at java.base@21.0.2/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:735) ~[native-image-test:na]
        at java.base@21.0.2/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762) ~[na:na]
        at com.vaadin.flow.server.VaadinService.lambda$init$1(VaadinService.java:236) ~[native-image-test:24.4.0.beta1]
        at com.vaadin.flow.server.VaadinService.runWithServiceContext(VaadinService.java:2372) ~[native-image-test:24.4.0.beta1]
        at com.vaadin.flow.server.VaadinService.init(VaadinService.java:234) ~[native-image-test:24.4.0.beta1]
        at com.vaadin.flow.spring.SpringVaadinServletService.init(SpringVaadinServletService.java:102) ~[na:na]
        at com.vaadin.flow.spring.SpringServlet.createServletService(SpringServlet.java:115) ~[native-image-test:na]
        at com.vaadin.flow.server.VaadinServlet.createServletService(VaadinServlet.java:336) ~[native-image-test:24.4.0.beta1]
        at com.vaadin.flow.server.VaadinServlet.init(VaadinServlet.java:132) ~[native-image-test:24.4.0.beta1]
        at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:944) ~[na:na]
        at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:808) ~[na:na]
        at org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedContext.load(TomcatEmbeddedContext.java:84) ~[native-image-test:3.2.5]
        at java.base@21.0.2/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184) ~[na:na]
        at java.base@21.0.2/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1708) ~[na:na]
        at java.base@21.0.2/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762) ~[na:na]
        at java.base@21.0.2/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:276) ~[na:na]
        at java.base@21.0.2/java.util.TreeMap$ValueSpliterator.forEachRemaining(TreeMap.java:3250) ~[na:na]
        at java.base@21.0.2/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) ~[native-image-test:na]
        at java.base@21.0.2/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[native-image-test:na]
        at java.base@21.0.2/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151) ~[native-image-test:na]
        at java.base@21.0.2/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174) ~[na:na]
        at java.base@21.0.2/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[native-image-test:na]
        at java.base@21.0.2/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) ~[native-image-test:na]
        at org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedContext.lambda$deferredLoadOnStartup$0(TomcatEmbeddedContext.java:67) ~[native-image-test:3.2.5]
        at org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedContext.doWithThreadContextClassLoader(TomcatEmbeddedContext.java:108) ~[native-image-test:3.2.5]
        at org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedContext.deferredLoadOnStartup(TomcatEmbeddedContext.java:66) ~[native-image-test:3.2.5]
        at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.performDeferredLoadOnStartup(TomcatWebServer.java:329) ~[native-image-test:3.2.5]
        at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:237) ~[native-image-test:3.2.5]
        at org.springframework.boot.web.servlet.context.WebServerStartStopLifecycle.start(WebServerStartStopLifecycle.java:44) ~[na:na]
        at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:288) ~[native-image-test:6.1.6]
        at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:471) ~[native-image-test:6.1.6]
        at java.base@21.0.2/java.lang.Iterable.forEach(Iterable.java:75) ~[native-image-test:na]
        at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:260) ~[native-image-test:6.1.6]
        at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:205) ~[native-image-test:6.1.6]
        at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:981) ~[native-image-test:6.1.6]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) ~[native-image-test:6.1.6]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[native-image-test:3.2.5]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[native-image-test:3.2.5]
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) ~[native-image-test:3.2.5]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:334) ~[native-image-test:3.2.5]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1354) ~[native-image-test:3.2.5]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343) ~[native-image-test:3.2.5]
        at com.example.application.Application.main(Application.java:20) ~[native-image-test:na]
        at java.base@21.0.2/java.lang.invoke.LambdaForm$DMH/sa346b79c.invokeStaticInit(LambdaForm$DMH) ~[na:na]

It is part of the console output shown after I started the Hilla application using ./target/native-image-test.

@taefi
Copy link
Contributor

taefi commented May 7, 2024

The possible fix is to add a resource pattern similar to what's done here for the hilla-openapi.json.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working hilla Issues related to Hilla Impact: High Severity: Blocker
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants