@@ -4,13 +4,16 @@ import com.mapk.annotations.KColumnDeserializer
44import com.mapk.core.EnumMapper
55import com.mapk.core.KFunctionWithInstance
66import com.mapk.core.getAliasOrName
7+ import com.mapk.deserialization.KColumnDeserializeBy
78import java.lang.IllegalArgumentException
89import java.sql.ResultSet
910import kotlin.reflect.KClass
1011import kotlin.reflect.KFunction
1112import kotlin.reflect.KParameter
1213import kotlin.reflect.full.companionObjectInstance
14+ import kotlin.reflect.full.findAnnotation
1315import kotlin.reflect.full.functions
16+ import kotlin.reflect.full.primaryConstructor
1417import kotlin.reflect.full.staticFunctions
1518import kotlin.reflect.jvm.isAccessible
1619import kotlin.reflect.jvm.jvmName
@@ -23,24 +26,33 @@ class ParameterForMap private constructor(
2326 private val objectGetter: (ResultSet ) -> Any?
2427
2528 init {
26- val deserializer = parameterKClazz.getDeserializer()
27-
28- if (deserializer != null ) {
29- val targetClass = deserializer.parameters.single().type.classifier as KClass <* >
29+ val deserializerFromParameter = param.getDeserializer()
30+ if (deserializerFromParameter != null ) {
31+ val deserialize = deserializerFromParameter::deserialize
3032
3133 objectGetter = {
32- deserializer .call(it.getObject(name, targetClass.javaObjectType ))
34+ deserialize .call(it.getObject(name, deserializerFromParameter.srcClass ))
3335 }
3436 } else {
35- val clazz = parameterKClazz.javaObjectType
37+ val deserializer = parameterKClazz.getDeserializer()
38+
39+ if (deserializer != null ) {
40+ val targetClass = deserializer.parameters.single().type.classifier as KClass <* >
3641
37- objectGetter = if (clazz.isEnum) {
38- {
39- EnumMapper .getEnum(clazz, it.getString(name))
42+ objectGetter = {
43+ deserializer.call(it.getObject(name, targetClass.javaObjectType))
4044 }
4145 } else {
42- {
43- it.getObject(name, clazz)
46+ val clazz = parameterKClazz.javaObjectType
47+
48+ objectGetter = if (clazz.isEnum) {
49+ {
50+ EnumMapper .getEnum(clazz, it.getString(name))
51+ }
52+ } else {
53+ {
54+ it.getObject(name, clazz)
55+ }
4456 }
4557 }
4658 }
@@ -59,6 +71,19 @@ class ParameterForMap private constructor(
5971 }
6072}
6173
74+ private fun KParameter.getDeserializer (): com.mapk.deserialization.KColumnDeserializer <* , * , * >? {
75+ val deserializers = this .annotations.mapNotNull { paramAnnotation ->
76+ paramAnnotation.annotationClass
77+ .findAnnotation<KColumnDeserializeBy >()
78+ ?.let { it.deserializer.primaryConstructor!! .call(paramAnnotation) }
79+ }
80+
81+ if (1 < deserializers.size)
82+ throw IllegalArgumentException (" Find multiple deserializer from ${(this .type.classifier as KClass <* >).jvmName} " )
83+
84+ return deserializers.singleOrNull()
85+ }
86+
6287private fun <T : Any > KClass<T>.getDeserializer (): KFunction <T >? {
6388 val deserializers = deserializerFromConstructors(this ) +
6489 deserializerFromStaticMethods(this ) +
0 commit comments