Java 21+QueryDSL 5.1.0含验证注解的@MappedSuperclass元模型生成失败
QueryDSL元模型生成失败:泛型参数前的空格引发匹配错误
使用的技术栈:
- Java 21(OpenJDK Runtime Environment build 21.0.8+9)
- Maven 3.9.10
- Jakarta Persistence 3.1.0
- Jakarta Annotation 2.1.1
- QueryDSL 5.1.0(querydsl-apt、querydsl-jpa)
- Hibernate Validator 8.0.2.Final
定义带验证注解的@MappedSuperclass父类:
import jakarta.persistence.Id; import jakarta.persistence.MappedSuperclass; import jakarta.validation.constraints.NotNull; @MappedSuperclass public abstract class AbstractMappedSuperclass<T> { @Id private Long id; @NotNull private T something; }
继承父类的实体类:
import jakarta.persistence.Entity; @Entity public class Ent extends AbstractMappedSuperclass<String> { }
执行以下Maven命令生成元模型:
mvn -X -P METAMODEL clean compile
生成时抛出的错误:
Caused by: java.lang.IllegalStateException: Did not find type T in AbstractMappedSuperclass<?> for Ent at com.querydsl.codegen.TypeResolver.resolveVar (TypeResolver.java:74) at com.querydsl.codegen.TypeResolver.resolve (TypeResolver.java:45) at com.querydsl.codegen.Property.createCopy (Property.java:92) at com.querydsl.codegen.EntityType.include (EntityType.java:262) at com.querydsl.apt.AbstractQuerydslProcessor.addSupertypeFields (AbstractQuerydslProcessor.java:416)
关键问题分析:
错误信息中泛型参数T前存在空格(显示为" T")。调试发现,当保留@NotNull等验证注解时,com.querydsl.codegen.TypeResolver.resolveVar方法内,getVarName(param)返回值为" T",而预期的varName是"T",导致字符串匹配失败;移除验证注解后,元模型可正常生成。
疑问:
这是配置错误,还是Hibernate Validator 8.0.2.Final、OpenJDK 21.0.8+9或QueryDSL存在bug?
内容的提问来源于stack exchange,提问作者mgsCatDev
相关产品推荐
相关产品推荐

