我正在使用hibernate-core 5.1.0并且我已经实现了一个为字段构建HashMap的转换器。问题是hibernate在构建sessionFactory时失败了。它正在抛出“无法实例化AttributeConverter”并且我已经附加了整个跟踪。
有趣的是,如果我创建一个扩展 HashMap< String,String> 并在转换器(和Hibernate实体类)中使用该类的类,这个例外就会消失。似乎转换类型不应该使用泛型。
还有其他方法可以解决这个问题吗?
我的转换器:
@Converter(autoApply=true)
public class JsonKeyValueConverter implements
AttributeConverter<HashMap<String, String>, String> // DOESNT work
//AttributeConverter<ClassExtendingHashMap, String> // works
{
public String convertToDatabaseColumn(HashMap<String, String> arg0) {
if ( arg0 == null ) {
return null;
}
return DBUtility.GSON.toJson(arg0);
}
public KeyValueData convertToEntityAttribute(String arg0) {
arg0 = StringUtils.isBlank(arg0) ? null : arg0;
return (KeyValueData) DBUtility.GSON.fromJson(arg0, HashMap.class );
}
}
java.lang.IllegalStateException:无法实例化 AttributeConverter [org.labs.collab.repo.entity.conversion.JsonKeyValueConverter at at org.hibernate.cfg.AbstractPropertyHolder.resolveAttributeConverterDefinition(AbstractPropertyHolder.java:98) 在 org.hibernate.cfg.annotations.PropertyBinder.makePropertyAndValue(PropertyBinder.java:195) 在 org.hibernate.cfg.annotations.PropertyBinder.makePropertyValueAndBind(PropertyBinder.java:216) 在 org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:2238) 在 org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:963) 在 org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:796) 在 org.hibernate.cfg.Configuration $ MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3788) 在 org.hibernate.cfg.Configuration $ MetadataSourceQueue.processMetadata(Configuration.java:3742) 在 org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1410) 在 org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1844) 引起:org.hibernate.AnnotationException:无法创建 AttributeConverter实例在 org.hibernate.cfg.AbstractPropertyHolder.makeAttributeConverterDefinition(AbstractPropertyHolder.java:132) 在 org.hibernate.cfg.AbstractPropertyHolder.resolveAttributeConverterDefinition(AbstractPropertyHolder.java:95) ... 27更多引起:java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl不能 强制转换为java.lang.Class org.hibernate.cfg.AttributeConverterDefinition。(AttributeConverterDefinition.java:67) 在 org.hibernate.cfg.AbstractPropertyHolder.makeAttributeConverterDefinition(AbstractPropertyHolder.java:129) ......还有28个
谢谢!
答案 0 :(得分:1)
你是对的,遗憾的是,AttributeConverter不适用于参数类型(泛型),所以最简单的方法是使用:
@Converter(autoApply=true)
public class JsonKeyValueConverter implements
AttributeConverter<HashMap, String> {
它允许您直接在被覆盖的方法中使用HashMap<String, String>
。