kotlin - использование функций высшего порядка в hibernate - PullRequest
0 голосов
/ 19 января 2020

У меня возникла странная проблема, когда я играл с kotlin + spring + hibernate, я почти уверен, что именно это вызывает проблемы:

inline fun <reified T : Enum<T>> generateGetter(unknownValue: T): (String) -> T {
    return { s ->
        var res = unknownValue
        for (v in enumValues<T>()) {
            if (s == v.name) {
                res = v
                break
            }
        }
        res
    }
}
enum class Degree {
    Unknown,
    HighSchool,
    Bachelor,
    Master;
    companion object {
        val getEnum = generateGetter(Unknown)
    }
}

И я получу эту ошибку при запуске ./gradlew bootRun:

Caused by: org.hibernate.MappingException: Could not create DynamicParameterizedType for type: org.hibernate.type.EnumType
        at org.hibernate.mapping.SimpleValue.createParameterImpl(SimpleValue.java:766) ~[hibernate-core-5.3.11.Final.jar:5.3.11.Final]
        at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:468) ~[hibernate-core-5.3.11.Final.jar:5.3.11.Final]
        at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:453) ~[hibernate-core-5.3.11.Final.jar:5.3.11.Final]
        at org.hibernate.mapping.Property.isValid(Property.java:227) ~[hibernate-core-5.3.11.Final.jar:5.3.11.Final]
        at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:624) ~[hibernate-core-5.3.11.Final.jar:5.3.11.Final]
        at org.hibernate.mapping.RootClass.validate(RootClass.java:267) ~[hibernate-core-5.3.11.Final.jar:5.3.11.Final]
        at org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:347) ~[hibernate-core-5.3.11.Final.jar:5.3.11.Final]
        at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:466) ~[hibernate-core-5.3.11.Final.jar:5.3.11.Final]
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:939) ~[hibernate-core-5.3.11.Final.jar:5.3.11.Final]
        at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:57) ~[spring-orm-5.1.9.RELEASE.jar:5.1.9.RELEASE]
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.1.9.RELEASE.jar:5.1.9.RELEASE]
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:390) ~[spring-orm-5.1.9.RELEASE.jar:5.1.9.RELEASE]
        ... 25 common frames omitted
Caused by: org.hibernate.boot.registry.classloading.spi.ClassLoadingException: Unable to load class [com.x.tutor.model.Country]
        at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:357) ~[hibernate-core-5.3.11.Final.jar:5.3.11.Final]
        at org.hibernate.mapping.SimpleValue.createParameterImpl(SimpleValue.java:753) ~[hibernate-core-5.3.11.Final.jar:5.3.11.Final]
        ... 36 common frames omitted
Caused by: java.lang.VerifyError: Bad return type
Exception Details:
  Location:
    com/x/tutor/model/Country$$special$$inlined$generateGetter$1.invoke(Ljava/lang/String;)Ljava/lang/Enum; @60: areturn
  Reason:
    Type 'java/lang/Object' (current frame, stack[0]) is not assignable to 'java/lang/Enum' (from method signature)
  Current Frame:
    bci: @60
    flags: { }
    locals: { 'com/x/tutor/model/Country$$special$$inlined$generateGetter$1', 'java/lang/String', 'java/lang/Object', '[Lcom/x/tutor/model/Country;', integer, integer }
    stack: { 'java/lang/Object' }
  Bytecode:
    0000000: 2b12 1fb8 0025 2ab4 0012 4db8 002b 4e2d
    0000010: be36 0403 3605 1505 1504 a200 212d 1505
    0000020: 323a 062b 1906 b600 31b8 0035 9900 0919
    0000030: 064d a700 0984 0501 a7ff de2c b0
  Stackmap Table:
    full_frame(@22,{Object[#2],Object[#25],Object[#45],Object[#60],Integer,Integer},{})
    append_frame(@53,Object[#39])
    full_frame(@59,{Object[#2],Object[#25],Object[#62],Object[#60],Integer,Integer},{})
        at com.x.tutor.model.Country.<clinit>(Enums.kt:94) ~[main/:na]
        at java.base/java.lang.Class.forName0(Native Method) ~[na:na]
        at java.base/java.lang.Class.forName(Class.java:398) ~[na:na]
        at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:351) ~[hibernate-core-5.3.11.Final.jar:5.3.11.Final]
        ... 37 common frames omitted

Странно то, что все работает без проблем, если я использую функцию запуска, предоставленную intellij

Кто-нибудь знает, что вызвало это и как устранить это?

Зная, что Jetbrains разработали kotlin, может быть, есть какая-то безумная оптимизация, которую они реализовали в плагине kotlin?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...