Skip to content
This repository was archived by the owner on Jan 20, 2023. It is now read-only.

Commit a379b0b

Browse files
committed
デシリアライザーの読み込みを追加
1 parent a8edfdc commit a379b0b

File tree

1 file changed

+36
-11
lines changed

1 file changed

+36
-11
lines changed

src/main/kotlin/com/mapk/krowmapper/ParameterForMap.kt

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,16 @@ import com.mapk.annotations.KColumnDeserializer
44
import com.mapk.core.EnumMapper
55
import com.mapk.core.KFunctionWithInstance
66
import com.mapk.core.getAliasOrName
7+
import com.mapk.deserialization.KColumnDeserializeBy
78
import java.lang.IllegalArgumentException
89
import java.sql.ResultSet
910
import kotlin.reflect.KClass
1011
import kotlin.reflect.KFunction
1112
import kotlin.reflect.KParameter
1213
import kotlin.reflect.full.companionObjectInstance
14+
import kotlin.reflect.full.findAnnotation
1315
import kotlin.reflect.full.functions
16+
import kotlin.reflect.full.primaryConstructor
1417
import kotlin.reflect.full.staticFunctions
1518
import kotlin.reflect.jvm.isAccessible
1619
import 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+
6287
private fun <T : Any> KClass<T>.getDeserializer(): KFunction<T>? {
6388
val deserializers = deserializerFromConstructors(this) +
6489
deserializerFromStaticMethods(this) +

0 commit comments

Comments
 (0)