使用 AttributeConverter 的 Spring Boot 测试不适用于 Maven 测试
Posted
技术标签:
【中文标题】使用 AttributeConverter 的 Spring Boot 测试不适用于 Maven 测试【英文标题】:Spring boot test with AttributeConverter not working with Maven test 【发布时间】:2021-11-02 13:33:14 【问题描述】:我有 Spring 引导单元测试(使用 @SpringBootTest 注释的类)在使用我的 IDE 时运行得很好。当我使用 Maven (mvn test) 运行它们时,它们都因相同的原因而失败:
原因:org.springframework.beans.factory.BeanCreationException:在类路径资源[my/package/config/DatasourceConfiguration.class]中定义名称为“entityManagerFactory”的bean创建错误:调用init方法失败;嵌套异常是 org.hibernate.AnnotationException:无法实例化 AttributeConverter [my.package.enum.AbstractEnumConverter] 引起:org.hibernate.AnnotationException:无法实例化 AttributeConverter [my.package.enum.AbstractEnumConverter] 引起:java.lang.NoSuchMethodException: my.package.AbstractEnumConverter.
()
我使用通用 AbstractEnumConverter 来转换我的实体上的枚举。 它看起来像这样:
@Converter
public abstract class AbstractEnumConverter<T extends Enum<T> & EnumInterface<E>, E> implements AttributeConverter<T, E>
private static Logger logger = LoggerFactory.getLogger(AbstractEnumConverter.class);
private final Class<T> clazz;
public AbstractEnumConverter(Class<T> clazz)
this.clazz = clazz;
@Override
public E convertToDatabaseColumn(T attribute)
return attribute != null ? attribute.getKey() : null;
@Override
public T convertToEntityAttribute(E dbData)
if (dbData == null)
return null;
T[] enums = clazz.getEnumConstants();
for (T e : enums)
if (e.getKey().equals(dbData))
return e;
logger.info("Could not find value for class ",dbData,clazz.getName());
return null;
这是我使用的枚举示例:
public enum ExampleEnum implements EnumInterface<Integer>
KEY(1);
private final Integer key;
ExampleEnum(Integer key)
this.key = key;
@Override
public Integer getKey()
return key;
public static class Converter extends AbstractEnumConverter<ExampleEnum, Integer>
public Converter()
super(ExampleEnum.class);
似乎 maven 出于某些我不知道的原因试图实例化我的 AbstractEnumConverter 类。 IDE 单元测试和运行应用程序时一切正常。
【问题讨论】:
你不应该首先将该注释应用于抽象类。 你说的是@Converter注解吗?如果是这样,你能给我一个解释吗?我已经阅读了多篇文章,建议以这种方式来避免每个枚举创建一个转换器。 是的,但是您仍然需要为每种类型创建具体的子类,以便您的@Converter
具有无参数构造函数。
我有一个具体的内部类,在每个枚举中扩展 AbstractEnumConverter(参见上面代码中的类 Converter)。我的抽象类没有任何无参数构造函数,因为我需要在构建对象时传递该类。
对,所以@Converter
应该在这些类上,而不是抽象基类上。 (可以说,Hibernate 应该知道无论如何都要跳过基类,并且您可能会考虑提交错误,但这似乎是问题所在。)
【参考方案1】:
Hibernate 将@Converter
注释解释为它应该实例化您的类并注册它,但它是一个没有默认构造函数的抽象类(您缺少的<init>()
)。也许 Hibernate 应该实现并排除带注释的抽象类,但事实并非如此,因此您应该从抽象类中删除注释并将其添加到基类中。
【讨论】:
以上是关于使用 AttributeConverter 的 Spring Boot 测试不适用于 Maven 测试的主要内容,如果未能解决你的问题,请参考以下文章
JPA/Hibernate:在复杂类上使用 AttributeConverter 时创建 UserType 是不是显而易见?
spring jpa之实体属性类型转换器AttributeConverter,自定义Converter,通用Converter
如何在没有 AttributeConverter 或 customUserType 的情况下使用 Hibernate 5.2.10 MySQL JSON 支持映射到 Java 实体类?
JPA AttributeConverter和Hibernate的ColumnTransformer在属性的加密和解密方面的区别