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

Commit 61b7b17

Browse files
authored
Merge pull request #25 from k163377/fix_deserializer_nullability
Fix deserializer's nullability.
2 parents e2445e9 + 9f2bc9c commit 61b7b17

File tree

6 files changed

+52
-29
lines changed

6 files changed

+52
-29
lines changed

README.ja.md

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -310,11 +310,7 @@ class LocalDateTimeDeserializerImpl(
310310

311311
override val srcClass: Class<String> = String::class.javaObjectType
312312

313-
override fun deserialize(source: String?): LocalDateTime? {
314-
return source?.let {
315-
LocalDateTime.parse(it, formatter)
316-
}
317-
}
313+
override fun deserialize(source: String): LocalDateTime = LocalDateTime.parse(source, formatter)
318314
}
319315
```
320316

@@ -340,11 +336,7 @@ class LocalDateTimeDeserializerImpl(
340336

341337
override val srcClass: Class<String> = String::class.javaObjectType
342338

343-
override fun deserialize(source: String?): LocalDateTime? {
344-
return source?.let {
345-
LocalDateTime.parse(it, formatter)
346-
}
347-
}
339+
override fun deserialize(source: String): LocalDateTime = LocalDateTime.parse(source, formatter)
348340
}
349341
```
350342

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,11 @@ Please see [here](https://jitpack.io/#ProjectMapK/KRowMapper/) for the formal in
7272
**2. add dependency**
7373

7474
```xml
75-
<dependency>
76-
<groupId>com.github.ProjectMapK</groupId>
77-
<artifactId>KRowMapper</artifactId>
78-
<version>Tag</version>
79-
</dependency>
75+
<dependency>
76+
<groupId>com.github.ProjectMapK</groupId>
77+
<artifactId>KRowMapper</artifactId>
78+
<version>Tag</version>
79+
</dependency>
8080
```
8181

8282
## Principle of operation

src/main/kotlin/com/mapk/deserialization/KColumnDeserialize.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ annotation class KColumnDeserializeBy(val deserializer: KClass<out AbstractKColu
99

1010
abstract class AbstractKColumnDeserializer<A : Annotation, S : Any, D>(protected val annotation: A) {
1111
abstract val srcClass: Class<S>
12-
abstract fun deserialize(source: S?): D?
12+
abstract fun deserialize(source: S): D?
1313
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ internal sealed class ParameterForMap<S, D> {
4141
deserializer: AbstractKColumnDeserializer<*, S, D>
4242
) : this(name, deserializer.srcClass, deserializer::deserialize)
4343

44-
override fun getObject(rs: ResultSet): D? = deserializer.call(rs.getObject(name, srcClazz))
44+
override fun getObject(rs: ResultSet): D? = rs.getObject(name, srcClazz)?.let { deserializer.call(it) }
4545
}
4646

4747
companion object {

src/test/kotlin/com/mapk/krowmapper/DeserializeByMethodTest.kt

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import java.sql.ResultSet
77
import org.junit.jupiter.api.Assertions
88
import org.junit.jupiter.api.DisplayName
99
import org.junit.jupiter.api.Test
10+
import org.junit.jupiter.api.assertThrows
1011

1112
class DeserializeByMethodTest {
1213
data class ByConstructor @KColumnDeserializer constructor(val fooString: String)
@@ -29,8 +30,8 @@ class DeserializeByMethodTest {
2930
)
3031

3132
@Test
32-
@DisplayName("マッピングテスト")
33-
fun test() {
33+
@DisplayName("正常なマッピングの場合")
34+
fun isCollect() {
3435
val resultSet = mockk<ResultSet>()
3536
every { resultSet.getObject("foo", any<Class<*>>()) } returns "foo"
3637
every { resultSet.getObject("bar", any<Class<*>>()) } returns "123"
@@ -44,4 +45,21 @@ class DeserializeByMethodTest {
4445
Assertions.assertEquals(321, result.baz.bazInt)
4546
Assertions.assertEquals("777", result.qux.quxString)
4647
}
48+
49+
data class MultipleDeserializer(val qux: Int) {
50+
@KColumnDeserializer
51+
constructor(qux: String) : this(qux.toInt())
52+
53+
companion object {
54+
@KColumnDeserializer
55+
fun factory(qux: Double) = MultipleDeserializer(qux.toInt())
56+
}
57+
}
58+
data class IllegalDst(val param: MultipleDeserializer)
59+
60+
@Test
61+
@DisplayName("複数のKColumnDeserializerが定義されていた場合")
62+
fun hasMultipleDeserializer() {
63+
assertThrows<IllegalArgumentException> { KRowMapper(::IllegalDst) }
64+
}
4765
}

src/test/kotlin/com/mapk/krowmapper/DeserializerTest.kt

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import java.sql.ResultSet
88
import java.time.LocalDateTime
99
import java.time.format.DateTimeFormatter
1010
import org.junit.jupiter.api.Assertions.assertEquals
11+
import org.junit.jupiter.api.Assertions.assertNull
1112
import org.junit.jupiter.api.DisplayName
1213
import org.junit.jupiter.api.Test
1314

@@ -26,25 +27,37 @@ class DeserializerTest {
2627

2728
override val srcClass: Class<String> = String::class.javaObjectType
2829

29-
override fun deserialize(source: String?): LocalDateTime? {
30-
return source?.let {
31-
LocalDateTime.parse(it, formatter)
32-
}
33-
}
30+
override fun deserialize(source: String): LocalDateTime = LocalDateTime.parse(source, formatter)
3431
}
3532

36-
data class Dst(@LocalDateTimeDeserializer val dateTime: LocalDateTime)
33+
data class Dst(@LocalDateTimeDeserializer val dateTime: LocalDateTime?)
34+
35+
val mapper = KRowMapper(::Dst)
3736

3837
@Test
39-
fun test() {
40-
val resultSet = mockk<ResultSet>()
41-
every { resultSet.getObject("dateTime", any<Class<*>>()) } returns "2020-02-01T01:23:45"
38+
@DisplayName("正常に変換した場合")
39+
fun isCollect() {
40+
val resultSet = mockk<ResultSet> {
41+
every { getObject("dateTime", any<Class<*>>()) } returns "2020-02-01T01:23:45"
42+
}
4243

43-
val result = KRowMapper(::Dst).mapRow(resultSet, 0)
44+
val result = mapper.mapRow(resultSet, 0)
4445

4546
assertEquals(
4647
LocalDateTime.parse("2020-02-01T01:23:45", DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss")),
4748
result.dateTime
4849
)
4950
}
51+
52+
@Test
53+
@DisplayName("取得結果がnullだった場合")
54+
fun isNull() {
55+
val resultSet = mockk<ResultSet> {
56+
every { getObject("dateTime", any<Class<*>>()) } returns null
57+
}
58+
59+
val result = mapper.mapRow(resultSet, 0)
60+
61+
assertNull(result.dateTime)
62+
}
5063
}

0 commit comments

Comments
 (0)