Problem with integration of Blaze Persistence into Wildfly

Hi,

I have various problems and bugs trying to integrate Blaze Persistence, version 1.6.17, into Wildfly 36 (jdk 21, Jakarta EE JPA, hibernate 6.6.7).

Due to legacy code, I would like to be able to use blaze persistence also in static methods.

When launching the server, I have this exception :

14:23:40,916 ERROR [com.ennov.web.security.filters.SecurityFilter] (default task-1) Unable to do doFilter: java.util.ServiceConfigurationError: com.blazebit.persistence.spi.ExtendedQuerySupport: com.blazebit.persistence.integration.hibernate.base.HibernateExtendedQuerySupport Unable to get public no-arg constructor
at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:586)
at java.base/java.util.ServiceLoader.getConstructor(ServiceLoader.java:679)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1240)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1273)
at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1309)
at java.base/java.util.ServiceLoader$3.hasNext(ServiceLoader.java:1393)
at com.blazebit@1.6.17//com.blazebit.persistence.impl.CriteriaBuilderConfigurationImpl.loadExtendedQuerySupport(CriteriaBuilderConfigurationImpl.java:2198)
at com.blazebit@1.6.17//com.blazebit.persistence.impl.CriteriaBuilderConfigurationImpl.(CriteriaBuilderConfigurationImpl.java:573)
at com.blazebit@1.6.17//com.blazebit.persistence.impl.CriteriaBuilderConfigurationProviderImpl.createConfiguration(CriteriaBuilderConfigurationProviderImpl.java:36)
at com.blazebit@1.6.17//com.blazebit.persistence.Criteria.getDefault(Criteria.java:54)
at deployment.ennov-engine.jar//com.ennov.prisma.api.security.BlazePersistenceHelper.initialize(BlazePersistenceHelper.java:43)
at deployment.ennov-engine.jar//com.ennov.prisma.api.security.BlazePersistenceHelper.get(BlazePersistenceHelper.java:59)
at deployment.ennov-engine.jar//com.ennov.prisma.api.security.SecurityHelper.getDocIdForSubjectedToAccessRestrictionsArchivedDocByUnit(SecurityHelper.java:508)
at deployment.ennov-engine.jar//com.ennov.prisma.api.security.SecurityHelper.isAttachmentAccessGranted(SecurityHelper.java:778)
at deployment.ennov-engine.jar//com.ennov.prisma.api.security.SecurityHelper$5.execute(SecurityHelper.java:446)
at deployment.ennov-engine.jar//com.ennov.prisma.api.security.SecurityHelper$5.execute(SecurityHelper.java:443)
at deployment.ennov-engine.jar//com.ennov.api.jpa.hibernate.HReturningWorker.execute(HReturningWorker.java:53)
at org.hibernate@6.6.7.Final//org.hibernate.jdbc.WorkExecutor.executeReturningWork(WorkExecutor.java:58)
at org.hibernate@6.6.7.Final//org.hibernate.internal.AbstractSharedSessionContract.lambda$doReturningWork$5(AbstractSharedSessionContract.java:1093)
at org.hibernate@6.6.7.Final//org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.coordinateWork(JdbcCoordinatorImpl.java:303)
at org.hibernate@6.6.7.Final//org.hibernate.internal.AbstractSharedSessionContract.doWork(AbstractSharedSessionContract.java:1097)
at org.hibernate@6.6.7.Final//org.hibernate.internal.AbstractSharedSessionContract.doReturningWork(AbstractSharedSessionContract.java:1093)
at deployment.ennov-engine.jar//com.ennov.api.jpa.Jpa.doReturningWork(Jpa.java:116)
at deployment.ennov-engine.jar//com.ennov.api.jpa.jdbc.ConnectionReturningWorker.execute(ConnectionReturningWorker.java:72)
at deployment.ennov-engine.jar//com.ennov.prisma.api.security.SecurityHelper.isAttachmentAccessGranted(SecurityHelper.java:448)
at deployment.ennov-engine.jar//com.ennov.prisma.api.common.jdo.AttachmentPO.canDownload(AttachmentPO.java:1067)
at deployment.ennov-engine.jar//com.ennov.prisma.api.common.jdo.AttachmentPO.createPreTO(AttachmentPO.java:805)
at deployment.ennov-engine.jar//com.ennov.prisma.api.common.jdo.AttachmentPO.getFileTO(AttachmentPO.java:838)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.hibernate@6.6.7.Final//org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor.intercept(ByteBuddyInterceptor.java:55)
at org.hibernate@6.6.7.Final//org.hibernate.proxy.ProxyConfiguration$InterceptorDispatcher.intercept(ProxyConfiguration.java:102)
at deployment.ennov-engine.jar//com.ennov.prisma.api.common.jdo.AttachmentPO$HibernateProxy$Bill7VSr.getFileTO(Unknown Source)
at deployment.ennov-engine.jar//com.ennov.prisma.api.utility.utils.profiles.ProfileEvaluationHelper.populateUserFiles(ProfileEvaluationHelper.java:354)
at deployment.ennov-engine.jar//com.ennov.prisma.api.utility.utils.profiles.ProfileEvaluationHelper.evaluateProfile(ProfileEvaluationHelper.java:117)
at deployment.ennov-engine.jar//com.ennov.prisma.api.utility.services.ProfileService.getUserProfile(ProfileService.java:83)
at deployment.ennov-engine.jar//com.ennov.prisma.api.utility.services.ProfileService.getUserProfile(ProfileService.java:62)
at deployment.ennov-webapp.war//com.ennov.web.framework.authentication.SessionBuilder.buildNewSessionForDatasource(SessionBuilder.java:38)
at deployment.ennov-security.jar//com.ennov.web.security.session.SessionManager.createNewSession(SessionManager.java:244)
at deployment.ennov-security.jar//com.ennov.web.security.session.SessionManager.validateRequest(SessionManager.java:180)
at deployment.ennov-webapp.war//com.ennov.web.security.AuthenticationHandler.validateRequest(AuthenticationHandler.java:328)
at deployment.ennov-webapp.war//com.ennov.web.security.AuthenticationHandler.authenticate0(AuthenticationHandler.java:173)
at deployment.ennov-webapp.war//com.ennov.web.security.AuthenticationHandler.authenticate(AuthenticationHandler.java:103)
at deployment.ennov-webapp.war//com.ennov.web.security.filters.SecurityFilter.authenticate(SecurityFilter.java:242)
at deployment.ennov-webapp.war//com.ennov.web.security.filters.SecurityFilter.doFilter(SecurityFilter.java:146)
at io.undertow.servlet@2.3.18.Final//io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)
at io.undertow.servlet@2.3.18.Final//io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at deployment.ennov-webapp.war//com.ennov.web.framework.http.filter.BlockFrameLoadingHeaderFilter.doFilter(BlockFrameLoadingHeaderFilter.java:44)
at io.undertow.servlet@2.3.18.Final//io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)
at io.undertow.servlet@2.3.18.Final//io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at deployment.ennov-webapp.war//com.ennov.web.security.filters.ReadynessFilter.doFilter(ReadynessFilter.java:55)
at io.undertow.servlet@2.3.18.Final//io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)
at io.undertow.servlet@2.3.18.Final//io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at io.undertow.servlet@2.3.18.Final//io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
at io.undertow.servlet@2.3.18.Final//io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)
at io.undertow.servlet@2.3.18.Final//io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
at io.undertow.servlet@2.3.18.Final//io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)
at deployment.ennov-security.jar//com.ennov.prisma.security.auth.sso.SSOHandler.handleRequest(SSOHandler.java:173)
at org.wildfly.extension.undertow@36.0.0.Final//org.wildfly.extension.undertow.deployment.GlobalRequestControllerHandler.handleRequest(GlobalRequestControllerHandler.java:51)
at io.undertow.servlet@2.3.18.Final//io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)
at io.undertow.core@2.3.18.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet@2.3.18.Final//io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:276)
at io.undertow.servlet@2.3.18.Final//io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)
at io.undertow.servlet@2.3.18.Final//io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:132)
at io.undertow.servlet@2.3.18.Final//io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
at io.undertow.servlet@2.3.18.Final//io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
at org.wildfly.extension.undertow@36.0.0.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1421)
at org.wildfly.extension.undertow@36.0.0.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1421)
at org.wildfly.extension.undertow@36.0.0.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1421)
at io.undertow.servlet@2.3.18.Final//io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:256)
at io.undertow.servlet@2.3.18.Final//io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:101)
at io.undertow.core@2.3.18.Final//io.undertow.server.Connectors.executeRootHandler(Connectors.java:395)
at io.undertow.core@2.3.18.Final//io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:861)
at org.jboss.threads@2.4.0.Final//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1990)
at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377)
at org.jboss.xnio@3.8.16.Final//org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)
at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: java.lang.NoClassDefFoundError: org/hibernate/hql/internal/QueryExecutionRequestException
at java.base/java.lang.Class.getDeclaredConstructors0(Native Method)
at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3549)
at java.base/java.lang.Class.getConstructor0(Class.java:3754)
at java.base/java.lang.Class.getConstructor(Class.java:2442)
at java.base/java.util.ServiceLoader$1.run(ServiceLoader.java:666)
at java.base/java.util.ServiceLoader$1.run(ServiceLoader.java:663)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:571)
at java.base/java.util.ServiceLoader.getConstructor(ServiceLoader.java:674)
… 77 more
Caused by: java.lang.ClassNotFoundException: org.hibernate.hql.internal.QueryExecutionRequestException from [Module “com.blazebit” version 1.6.17 from local module loader @fd0e5b6 (finder: local module finder @4eed46ee (roots: C:\Workspace\ennov-app.dev-10.x\wildfly-36.0.0.Final\modules,C:\Workspace\ennov-app.dev-10.x\wildfly-36.0.0.Final\modules\system\layers\base))]
at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:201)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:408)
at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:396)
at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:115)
… 85 more


so am i using the right version of blaze persistence (1.6.17) or not ?

which jar files should be added into the blaze module ?

I don’t manage to use advices given in this article for the blaze initialization (1.2.2 / 1.2.3) :

This is the module.xml for blaze module :

<?xml version="1.0" encoding="UTF-8"?>
<!--
  ~ Copyright The WildFly Authors
  ~ SPDX-License-Identifier: Apache-2.0
  -->
<module name="com.blazebit" xmlns="urn:jboss:module:1.9">
    <resources>
        <resource-root path="blaze-persistence-core-api-jakarta-1.6.17.jar"/>
        <resource-root path="blaze-persistence-core-impl-jakarta-1.6.17.jar"/>
        <resource-root path="blaze-persistence-core-parser-jakarta-1.6.17.jar"/>
        <resource-root path="blaze-persistence-integration-hibernate-6.2-1.6.17.jar"/>
        <resource-root path="blaze-persistence-integration-hibernate-base-jakarta-1.6.17.jar"/>
        <resource-root path="blaze-persistence-integration-querydsl-expressions-1.6.17.jar"/>
        <resource-root path="blaze-persistence-integration-jpa-base-jakarta-1.6.17.jar"/>
    </resources>
    <dependencies>
        <!-- Jakarta APIs -->
        <module name="jakarta.persistence.api"/>
        <module name="jakarta.transaction.api"/>

        <!-- Hibernate ORM -->
<!--        <module name="org.hibernate" />-->
        <module name="org.hibernate.orm" services="import"/>

        <!-- Logging -->
        <module name="org.jboss.logging"/>
        <module name="java.logging"/>
    </dependencies>
</module>

Thanks a lot for your attention and help.

Marko

You have to replace the hibernate-base-jakarta artifact with the hibernate6-base artifact, since that is the correct dependency. Also check the pom.xml for that: Maven Central: com.blazebit:blaze-persistence-integration-hibernate-6.2

I understand that it might be somewhat hard to setup in Wildfly as a module, because you can’t benefit from the pom.xml dependencies, but I wonder, why aren’t you bundling Blaze-Persistence with your application?

Hi. First, thanks a lot for your answer. Initally, I have tried to bundle Blaze-Persistence with my app but was having some bugs, that’s why I switched back to module setup. For sure, once I make it work, I will try to find the simplest possible setup.

The exception above has gone, but I have another one now :

java.lang.IllegalStateException: No CriteriaBuilderConfigurationProvider found on the class path. Please check if a valid implementation is on the class path.

The exception appears after this :

    //Thread.currentThread().setContextClassLoader(CriteriaBuilderConfigurationProvider.class.getClassLoader());
CriteriaBuilderConfiguration config = Criteria.getDefault();
this.cbf = config.createCriteriaBuilderFactory(emf);

If I uncomment Thread.current etc. , I am getting another exception…

Update:

So if I uncomment Thread.currentThread()…, I am getting an exception in :

this.cbf = config.createCriteriaBuilderFactory(emf) and the exception is

java.lang.NullPointerException: Cannot invoke "org.hibernate.service.spi.ServiceBinding.getService()" because the return value of "org.hibernate.service.spi.ServiceRegistryImplementor.locateServiceBinding(java.lang.Class)" is null

How could I solve this, according to you?

Thanks again for your help.

I have not tried setting up Blaze-Persistence as Wildfly module yet, so you are on uncharted ground here. I can tell you that blaze-persistence-core-api-jakarta tries to use the ServiceLoader API to load a class from the blaze-persistence-core-impl-jakarta and blaze-persistence-integration-hibernate-6.2/blaze-persistence-integration-hibernate6-base artifacts. Not sure what needs to be adapted in the module.xml file to make this work.
Also, the blaze-persistence-integration-hibernate-6.2/blaze-persistence-integration-hibernate6-base artifacts provide ServiceLoader services to Hibernate ORM.

Unless you want to debug further into to the guts of Wildfly class loading and module.xml, I would suggest you add the JARs as part of your application instead :slight_smile:
What errors did you get or bugs did you hit when trying to package it in your application?

Hi! Again, many thanks for your help, really appreciate.

I have actually managed to make it work, but am getting another bug, that I will write in another question (just above this one).

Hopefully, this will avoid someone else spending 3-4 days on configuration :slight_smile: . So this is what I have in the module.xml file of blaze persistence :

<?xml version="1.0" encoding="UTF-8"?>
<!--
  ~ Copyright The WildFly Authors
  ~ SPDX-License-Identifier: Apache-2.0
  -->
<module name="com.blazebit" xmlns="urn:jboss:module:1.9">
    <resources>
        <resource-root path="blaze-persistence-core-api-jakarta-1.6.17.jar"/>
        <resource-root path="blaze-persistence-core-impl-jakarta-1.6.17.jar"/>
        <resource-root path="blaze-persistence-core-parser-jakarta-1.6.17.jar"/>
        <resource-root path="blaze-persistence-integration-hibernate-6.2-1.6.17.jar"/>
        <resource-root path="blaze-persistence-integration-hibernate6-base-1.6.17.jar"/>
        <resource-root path="blaze-persistence-integration-querydsl-expressions-1.6.17.jar"/>
        <resource-root path="blaze-persistence-integration-jpa-base-jakarta-1.6.17.jar"/>
        <resource-root path="blaze-common-utils-0.1.21.jar"/>
    </resources>
    <dependencies>
        <!-- Jakarta APIs -->
        <module name="jakarta.persistence.api"/>
        <module name="jakarta.transaction.api"/>

        <!-- Hibernate ORM -->
        <module name="org.hibernate.orm" services="import"/>

        <!-- Logging -->
        <module name="org.jboss.logging"/>
        <module name="java.logging"/>
    </dependencies>
</module>

and the key change is actually in jboss-deployment-structure.xml file, these 2 lines :

            <module name="org.hibernate.orm" services="import"/>
            <module name="com.blazebit" services="import" />

services=”import” must be put.

Finally, with these changes, it is NOT necessary to write the line :

Thread.currentThread().setContextClassLoader(CriteriaBuilderConfigurationProvider.class.getClassLoader());

before :

CriteriaBuilderConfiguration config = Criteria.getDefault();
this.cbf = config.createCriteriaBuilderFactory(emf);

I’d very much appreciate if you could contribute the necessary bits to Blaze-Persistence: GitHub - Blazebit/blaze-persistence: Rich Criteria API for JPA providers
It seems like we could package up Blaze-Persistence as Galleon Feature pack to make it easier for others to consume: Ship Your WildFly Additions via Galleon Feature Packs

Do you mean update the README file? P.S. I have no experience in this kind of contribution, that’s why I am asking such a question.

Oftentimes, such a small and isolated contribution is the perfect task to get started with open source, hence I’m suggesting you to consider doing that. Also, once it’s part of Blaze-Persistence itself, ideally with an automated test, you can rely on this official artifact instead of maintaining this yourself in a custom repository :slight_smile: