quarkus icon indicating copy to clipboard operation
quarkus copied to clipboard

@Valid throws NPE if hibernate-orm is disabled in native mode

Open ls-bit opened this issue 6 months ago • 2 comments

Describe the bug

When you use quarkus-hibernate-validator and quarkus-hibernate-orm and set property quarkus.hibernate-orm.enabled=false validation with @Valid leads to a NullPointerException in native mode.

The exception happens inside JPATraversableResolver, which is used as soon as quarkus-hibernate-orm is used. My guess is that setting quarkus.hibernate-orm.enabled=false leads to required classes not being included in native image leading to an exception. Maybe JPATraversableResolver should not be used when hibernate-orm is set to disabled.

Expected behavior

No exception

Actual behavior

2025-06-06 14:14:02,765 ERROR [io.qua.ver.htt.run.QuarkusErrorHandler] (executor-thread-1) HTTP Request to /hello failed, error id: 04d9b623-7099-417e-a287-9a20563565c6-2: jakarta.validation.ValidationException: HV000041: Call to TraversableResolver.isReachable() threw an exception.
        at org.hibernate.validator.internal.engine.ValidatorImpl.isReachable(ValidatorImpl.java:1316)
        at org.hibernate.validator.internal.engine.ValidatorImpl.isValidationRequired(ValidatorImpl.java:1291)
        at org.hibernate.validator.internal.engine.ValidatorImpl.validateMetaConstraint(ValidatorImpl.java:549)
        at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForSingleDefaultGroupElement(ValidatorImpl.java:518)
        at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:488)
        at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:450)
        at org.hibernate.validator.internal.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:400)
        at org.hibernate.validator.internal.engine.ValidatorImpl.validateCascadedAnnotatedObjectForCurrentGroup(ValidatorImpl.java:629)
        at org.hibernate.validator.internal.engine.ValidatorImpl.validateCascadedConstraints(ValidatorImpl.java:590)
        at org.hibernate.validator.internal.engine.ValidatorImpl.validateParametersInContext(ValidatorImpl.java:880)
        at org.hibernate.validator.internal.engine.ValidatorImpl.validateParameters(ValidatorImpl.java:283)
        at org.hibernate.validator.internal.engine.ValidatorImpl.validateParameters(ValidatorImpl.java:235)
        at io.quarkus.hibernate.validator.runtime.interceptor.AbstractMethodValidationInterceptor.validateMethodInvocation(AbstractMethodValidationInterceptor.java:63)
        at io.quarkus.hibernate.validator.runtime.jaxrs.ResteasyReactiveEndPointValidationInterceptor.validateMethodInvocation(ResteasyReactiveEndPointValidationInterceptor.java:21)
        at io.quarkus.hibernate.validator.runtime.jaxrs.ResteasyReactiveEndPointValidationInterceptor_Bean.intercept(Unknown Source)
        at io.quarkus.arc.impl.InterceptorInvocation.invoke(InterceptorInvocation.java:42)
        at io.quarkus.arc.impl.AroundInvokeInvocationContext.perform(AroundInvokeInvocationContext.java:30)
        at io.quarkus.arc.impl.InvocationContexts.performAroundInvoke(InvocationContexts.java:27)
        at org.acme.GreetingResource_Subclass.hello(Unknown Source)
        at org.acme.GreetingResource$quarkusrestinvoker$hello_2889140ebf5e1a49adc1ad65bda0427e279fe3e5.invoke(Unknown Source)
        at org.jboss.resteasy.reactive.server.handlers.InvocationHandler.handle(InvocationHandler.java:29)
        at io.quarkus.resteasy.reactive.server.runtime.QuarkusResteasyReactiveRequestContext.invokeHandler(QuarkusResteasyReactiveRequestContext.java:141)
        at org.jboss.resteasy.reactive.common.core.AbstractResteasyReactiveContext.run(AbstractResteasyReactiveContext.java:147)
        at io.quarkus.vertx.core.runtime.VertxCoreRecorder$15.runWith(VertxCoreRecorder.java:637)
        at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2651)
        at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2630)
        at org.jboss.threads.EnhancedQueueExecutor.runThreadBody(EnhancedQueueExecutor.java:1622)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1589)
        at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:11)
        at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:11)
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
        at [email protected]/java.lang.Thread.runWith(Thread.java:1596)
        at [email protected]/java.lang.Thread.run(Thread.java:1583)
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:833)
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.windows.WindowsPlatformThreads.osThreadStartRoutine(WindowsPlatformThreads.java:214)  
Caused by: java.lang.NullPointerException
        at jakarta.persistence.Persistence$PersistenceUtilImpl.isLoaded(Persistence.java:142)
        at org.hibernate.validator.internal.engine.resolver.JPATraversableResolver.isReachable(JPATraversableResolver.java:52)
        at org.hibernate.validator.internal.engine.resolver.CachingJPATraversableResolverForSingleValidation.lambda$isReachable$0(CachingJPATraversableResolverForSingleValidation.java:43)
        at [email protected]/java.util.HashMap.computeIfAbsent(HashMap.java:1228)
        at org.hibernate.validator.internal.engine.resolver.CachingJPATraversableResolverForSingleValidation.isReachable(CachingJPATraversableResolverForSingleValidation.java:43)
        at org.hibernate.validator.internal.engine.ValidatorImpl.isReachable(ValidatorImpl.java:1307)
        ... 34 more

How to Reproduce?

See https://github.com/ls-bit/quarkus-issue-48270

(I am not sure why it cannot be reproduced with ./gradlew testNative...)

Output of uname -a or ver

Microsoft Windows [Version 10.0.26100.4061]

Output of java -version

openjdk version "21.0.2" 2024-01-16 OpenJDK Runtime Environment GraalVM CE 21.0.2+13.1

Mandrel or GraalVM version (if different from Java)

No response

Quarkus version or git rev

3.23.2

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

Gradle 8.13

Additional information

No response

ls-bit avatar Jun 06 '25 12:06 ls-bit

/cc @Karm (native-image), @galderz (native-image), @gsmet (hibernate-orm), @zakkak (native-image)

quarkus-bot[bot] avatar Jun 06 '25 12:06 quarkus-bot[bot]

@marko-bekhta that would be one for you, I think!

gsmet avatar Jun 10 '25 11:06 gsmet

Thanks @marko-bekhta and @gsmet

I am closing issue, since the fix has been released with 3.24.1

ls-bit avatar Jul 03 '25 12:07 ls-bit