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

Commit c8dfc1f

Browse files
committed
ConversionServiceを用いた変換を行う形に修正
1 parent 87f1b97 commit c8dfc1f

File tree

2 files changed

+24
-8
lines changed

2 files changed

+24
-8
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class KRowMapper<T : Any> private constructor(
3737

3838
private val conversionService: ConversionService = conversionService ?: DefaultConversionService.getSharedInstance()
3939
private val parameters: List<ParameterForMap<*, *>> =
40-
function.requiredParameters.map { ParameterForMap.newInstance(it) }
40+
function.requiredParameters.map { ParameterForMap.newInstance(it, this.conversionService) }
4141

4242
override fun mapRow(rs: ResultSet, rowNum: Int): T {
4343
val adaptor = function.getArgumentAdaptor()

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

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.mapk.core.getAnnotatedFunctionsFromCompanionObject
99
import com.mapk.core.getKClass
1010
import com.mapk.deserialization.AbstractKColumnDeserializer
1111
import com.mapk.deserialization.KColumnDeserializeBy
12+
import org.springframework.core.convert.ConversionService
1213
import java.lang.IllegalArgumentException
1314
import java.sql.ResultSet
1415
import kotlin.reflect.KClass
@@ -23,8 +24,18 @@ internal sealed class ParameterForMap<S, D> {
2324
abstract val name: String
2425
abstract fun getObject(rs: ResultSet): D?
2526

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+
}
2839
}
2940

3041
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> {
4556
}
4657

4758
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> {
4963
param.getDeserializer()?.let {
5064
return Deserializer(param.name, it)
5165
}
5266

5367
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)
5670
}
5771

58-
return param.requiredClazz.javaObjectType.let {
72+
val requiredClazz = param.requiredClazz.javaObjectType
73+
74+
return requiredClazz.let {
5975
when (it.isEnum) {
6076
true -> Enum(param.name, it)
61-
false -> Plain(param.name, it)
77+
false -> Default(param.name, it, conversionService)
6278
}
6379
}
6480
}

0 commit comments

Comments
 (0)