У меня возникла странная проблема, когда я играл с 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?