使用querydsl-spatial无法生成QueryDSL的QClass问题排查
Spring Boot 3.2.3集成QueryDSL-Spatial构建异常解决方案求助
项目环境与依赖配置
当前使用Spring Boot 3.2.3,JDK 21,项目依赖与构建配置如下:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.3</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.test</groupId> <artifactId>service</artifactId> <version>0.0.1-SNAPSHOT</version> <name>service</name> <properties> <java.version>21</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-spatial</artifactId> <version>${hibernate.version}</version> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>jakarta.validation</groupId> <artifactId>jakarta.validation-api</artifactId> <version>3.1.0-M1</version> </dependency> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-apt</artifactId> <version>${querydsl.version}</version> <classifier>jakarta</classifier> <scope>provided</scope> </dependency> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-jpa</artifactId> <classifier>jakarta</classifier> <version>${querydsl.version}</version> </dependency> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-core</artifactId> <version>${querydsl.version}</version> </dependency> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-spatial</artifactId> <version>${querydsl.version}</version> </dependency> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-sql</artifactId> <version>${querydsl.version}</version> </dependency> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-sql-spatial</artifactId> <version>${querydsl.version}</version> </dependency> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-sql-spring</artifactId> <version>${querydsl.version}</version> </dependency> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-codegen</artifactId> <version>${querydsl.version}</version> </dependency> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-sql-codegen</artifactId> <version>${querydsl.version}</version> </dependency> <dependency> <groupId>net.postgis</groupId> <artifactId>postgis-jdbc</artifactId> <version>2023.1.0</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>com.mysema.maven</groupId> <artifactId>apt-maven-plugin</artifactId> <version>1.1.3</version> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>process</goal> </goals> <configuration> <outputDirectory>target/generated-sources/java</outputDirectory> <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor> </configuration> </execution> </executions> </plugin> </plugins> </build>
实体类空间字段定义
实体类中使用了Geolatte的Point类型存储地理信息:
@Column(columnDefinition = "geography") private org.geolatte.geom.Point location;
构建异常信息
执行构建时抛出以下异常:
Caused by: java.lang.IllegalArgumentException: com.querydsl.sql.Configuration is not registered at com.querydsl.codegen.AbstractModule.get (AbstractModule.java:99) at com.querydsl.sql.spatial.SpatialSupport.addSupport (SpatialSupport.java:58) at com.querydsl.codegen.AbstractModule.loadExtensions (AbstractModule.java:83) at com.querydsl.apt.DefaultConfiguration.<init> (DefaultConfiguration.java:283) at com.querydsl.apt.DefaultConfiguration.<init> (DefaultConfiguration.java:114) at com.querydsl.apt.jpa.JPAConfiguration.<init> (JPAConfiguration.java:83) at com.querydsl.apt.jpa.JPAAnnotationProcessor.createConfiguration (JPAAnnotationProcessor.java:42) at com.querydsl.apt.AbstractQuerydslProcessor.process (AbstractQuerydslProcessor.java:82) at com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor (JavacProcessingEnvironment.java:1021) at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs (JavacProcessingEnvironment.java:937) at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run (JavacProcessingEnvironment.java:1265) at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing (JavacProcessingEnvironment.java:1380) at com.sun.tools.javac.main.JavaCompiler.processAnnotations (JavaCompiler.java:1272) at com.sun.tools.javac.main.JavaCompiler.compile (JavaCompiler.java:946) at com.sun.tools.javac.api.JavacTaskImpl.lambda$doCall$0 (JavacTaskImpl.java:104) at com.sun.tools.javac.api.JavacTaskImpl.invocationHelper (JavacTaskImpl.java:152) at com.sun.tools.javac.api.JavacTaskImpl.doCall (JavacTaskImpl.java:100) at com.sun.tools.javac.api.JavacTaskImpl.call (JavacTaskImpl.java:94) at com.sun.tools.javac.api.JavacTaskImpl.call (JavacTaskImpl.java:72) at java.util.concurrent.FutureTask.run (FutureTask.java:317) at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1144) at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:642) at java.lang.Thread.run (Thread.java:1583)
问题补充
曾尝试切换使用querydsl-maven-plugin,但该插件似乎不支持Jakarta规范,特此寻求可行的解决方案。
解决方案
1. 移除不必要的SQL相关依赖
异常根源是引入了QueryDSL的SQL模块依赖(querydsl-sql、querydsl-sql-spatial、querydsl-sql-spring、querydsl-sql-codegen),但当前项目使用JPA,这些SQL模块会导致注解处理器加载错误的配置类。需要从依赖中移除这些SQL相关的依赖项。
2. 配置正确的QueryDSL与Hibernate版本
Spring Boot 3.2.3需要适配兼容Jakarta的QueryDSL版本(5.0.0+),同时指定Hibernate版本与Spring Boot父版本匹配。在properties中添加:
<properties> <java.version>21</java.version> <querydsl.version>5.1.0</querydsl.version> <hibernate.version>6.4.4.Final</hibernate.version> </properties>
3. 替换注解处理器插件
旧的apt-maven-plugin对Jakarta兼容性差,改用maven-compiler-plugin配置注解处理器路径,确保加载Jakarta版本的QueryDSL处理器:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.12.1</version> <configuration> <annotationProcessorPaths> <path> <groupId>com.querydsl</groupId> <artifactId>querydsl-apt</artifactId> <version>${querydsl.version}</version> <classifier>jakarta</classifier> </path> <path> <groupId>jakarta.persistence</groupId> <artifactId>jakarta.persistence-api</artifactId> <version>3.1.0</version> </path> <path> <groupId>org.hibernate.common</groupId> <artifactId>hibernate-commons-annotations</artifactId> <version>6.0.6.Final</version> </path> </annotationProcessorPaths> <proc>none</proc> </configuration> </plugin> </plugins> </build>
4. 确保Geolatte依赖存在
如果项目中未自动引入geolatte-geom,手动添加依赖:
<dependency> <groupId>org.geolatte</groupId> <artifactId>geolatte-geom</artifactId> <version>1.9.0</version> </dependency>
完成以上调整后,重新执行构建即可解决异常。
内容的提问来源于stack exchange,提问作者sromdhane
相关产品推荐
相关产品推荐

