Hibernate AttributeConverter:无法实例化异常

时间:2016-03-24 13:50:37

标签: hibernate jpa

我正在使用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个

谢谢!

1 个答案:

答案 0 :(得分:1)

你是对的,遗憾的是,AttributeConverter不适用于参数类型(泛型),所以最简单的方法是使用:

@Converter(autoApply=true)
public class JsonKeyValueConverter implements 
           AttributeConverter<HashMap, String> {

它允许您直接在被覆盖的方法中使用HashMap<String, String>