@@ -9,6 +9,7 @@ import com.mapk.core.getAnnotatedFunctionsFromCompanionObject
9
9
import com.mapk.core.getKClass
10
10
import com.mapk.deserialization.AbstractKColumnDeserializer
11
11
import com.mapk.deserialization.KColumnDeserializeBy
12
+ import org.springframework.core.convert.ConversionService
12
13
import java.lang.IllegalArgumentException
13
14
import java.sql.ResultSet
14
15
import kotlin.reflect.KClass
@@ -23,8 +24,18 @@ internal sealed class ParameterForMap<S, D> {
23
24
abstract val name: String
24
25
abstract fun getObject (rs : ResultSet ): D ?
25
26
26
- private class Plain <T >(override val name : String , val requiredClazz : Class <T >) : ParameterForMap<T, T>() {
27
- override fun getObject (rs : ResultSet ): T ? = rs.getObject(name, requiredClazz)
27
+ private class Default <D >(
28
+ override val name : String ,
29
+ val requiredClazz : Class <D >,
30
+ private val conversionService : ConversionService
31
+ ) : ParameterForMap<Any, D>() {
32
+ override fun getObject (rs : ResultSet ): D ? = rs.getObject(name)?.let {
33
+ if (requiredClazz.isInstance(it))
34
+ @Suppress(" UNCHECKED_CAST" )
35
+ it as D ?
36
+ else
37
+ conversionService.convert(it, requiredClazz)
38
+ }
28
39
}
29
40
30
41
private class Enum <D >(override val name : String , val enumClazz : Class <D >) : ParameterForMap<String, D>() {
@@ -45,20 +56,25 @@ internal sealed class ParameterForMap<S, D> {
45
56
}
46
57
47
58
companion object {
48
- fun <T : Any > newInstance (param : ValueParameter <T >): ParameterForMap <* , T > {
59
+ fun <T : Any > newInstance (
60
+ param : ValueParameter <T >,
61
+ conversionService : ConversionService
62
+ ): ParameterForMap <* , T > {
49
63
param.getDeserializer()?.let {
50
64
return Deserializer (param.name, it)
51
65
}
52
66
53
67
param.requiredClazz.getDeserializer()?.let {
54
- val targetClass = it.parameters.single().getKClass().javaObjectType
55
- return Deserializer (param.name, targetClass , it)
68
+ val srcClass = it.parameters.single().getKClass().javaObjectType
69
+ return Deserializer (param.name, srcClass , it)
56
70
}
57
71
58
- return param.requiredClazz.javaObjectType.let {
72
+ val requiredClazz = param.requiredClazz.javaObjectType
73
+
74
+ return requiredClazz.let {
59
75
when (it.isEnum) {
60
76
true -> Enum (param.name, it)
61
- false -> Plain (param.name, it)
77
+ false -> Default (param.name, it, conversionService )
62
78
}
63
79
}
64
80
}
0 commit comments