@@ -4,13 +4,16 @@ import com.mapk.annotations.KColumnDeserializer
4
4
import com.mapk.core.EnumMapper
5
5
import com.mapk.core.KFunctionWithInstance
6
6
import com.mapk.core.getAliasOrName
7
+ import com.mapk.deserialization.KColumnDeserializeBy
7
8
import java.lang.IllegalArgumentException
8
9
import java.sql.ResultSet
9
10
import kotlin.reflect.KClass
10
11
import kotlin.reflect.KFunction
11
12
import kotlin.reflect.KParameter
12
13
import kotlin.reflect.full.companionObjectInstance
14
+ import kotlin.reflect.full.findAnnotation
13
15
import kotlin.reflect.full.functions
16
+ import kotlin.reflect.full.primaryConstructor
14
17
import kotlin.reflect.full.staticFunctions
15
18
import kotlin.reflect.jvm.isAccessible
16
19
import kotlin.reflect.jvm.jvmName
@@ -23,24 +26,33 @@ class ParameterForMap private constructor(
23
26
private val objectGetter: (ResultSet ) -> Any?
24
27
25
28
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
30
32
31
33
objectGetter = {
32
- deserializer .call(it.getObject(name, targetClass.javaObjectType ))
34
+ deserialize .call(it.getObject(name, deserializerFromParameter.srcClass ))
33
35
}
34
36
} 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 <* >
36
41
37
- objectGetter = if (clazz.isEnum) {
38
- {
39
- EnumMapper .getEnum(clazz, it.getString(name))
42
+ objectGetter = {
43
+ deserializer.call(it.getObject(name, targetClass.javaObjectType))
40
44
}
41
45
} 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
+ }
44
56
}
45
57
}
46
58
}
@@ -59,6 +71,19 @@ class ParameterForMap private constructor(
59
71
}
60
72
}
61
73
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
+
62
87
private fun <T : Any > KClass<T>.getDeserializer (): KFunction <T >? {
63
88
val deserializers = deserializerFromConstructors(this ) +
64
89
deserializerFromStaticMethods(this ) +
0 commit comments