Spring Boot测试中AttributeConverter在Maven test执行时失效问题
问题根因
- 你在抽象类
AbstractEnumConverter上标注了@Converter注解,Hibernate启动时会扫描所有带该注解的类,尝试实例化后注册为全局类型转换器 - 该类是抽象类,且仅提供带参数的构造方法,没有无参构造方法,因此Hibernate实例化时抛出
NoSuchMethodException异常 - IDE运行无异常是因为IDE的类扫描范围、增量编译策略和Maven全量编译的严格扫描逻辑不一致,属于IDE的非标准兼容表现,Maven执行的是标准的Spring Boot/Hibernate启动逻辑
解决方案
- 移除抽象类
AbstractEnumConverter上的@Converter注解,该注解无需加在抽象基类上
// 删掉此处的@Converter注解 public abstract class AbstractEnumConverter<T extends Enum<T> & EnumInterface<E>, E> implements AttributeConverter<T, E> { // 原有逻辑保持不变 }
- 在所有实际使用的Converter实现类上添加
@Converter注解即可,比如示例中的静态内部类:
public enum ExampleEnum implements EnumInterface<Integer> { // 原有枚举逻辑保持不变 @Converter // 在此处添加注解 public static class Converter extends AbstractEnumConverter<ExampleEnum, Integer> { public Converter() { super(ExampleEnum.class); } } }
如果不需要全局生效,也可以不在子类上加@Converter,直接在实体类对应的枚举字段上指定转换器即可:
@Convert(converter = ExampleEnum.Converter.class) private ExampleEnum exampleEnum;
内容的提问来源于stack exchange,提问作者Simon Weber
相关产品推荐
相关产品推荐

