ํธ์ง: ๋ ๊ฐ๋จํ ์์ ๋ก ์ ๋ฐ์ดํธ๋์์ต๋๋ค.
๋ฌธ์ ์ ๋ค๋ฆญ๊ณผ JDBI๊ฐ ํจ๊ป ์๋ํ๊ณ ์ด์ ๋ฒ์ ์ JDBI์๋ ๋ถ๊ตฌํ๊ณ ์ด ์์ ์ ์ ์ ๋ณธ ์ ์ด ์์ง๋ง ์ด๋ค ์ด์ ๋ก ์ธํด ์ด์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
org.jdbi.v3.sqlobject.UnableToCreateSqlObjectException: ์ธํฐํ์ด์ค Bar์ ๋ชจํธํ ๋ฉ์๋๊ฐ ์์ต๋๋ค. [public abstract java.lang.Object Foo.baz(java.util.UUID), public abstract java.util.UUID Bar.baz(java.util.UUID )], ๋ช ์์ ์ฌ์ ์๋ก ํด๊ฒฐํ์ญ์์ค.
http://jdbi.org/#_annotations_and_inheritance
์ข์ ์ธก์ ์ ์ํด @Override ๋ฅผ ์๋ํ์ง๋ง ์๋ฌด ๊ฒ๋ ๋ณ๊ฒฝ๋์ง ์์์ต๋๋ค.
interface Foo<T> {
<strong i="12">@SqlQuery</strong>
fun baz(a: UUID): T
}
interface Bar : Foo<UUID> {
@SqlQuery("SELECT ClientID " +
"FROM ClientInstance " +
"WHERE ClientInstanceID = ?")
override fun baz(a: UUID): UUID
}
JDBI.inTransactionUnchecked { handle ->
val tester = handle.attach(Bar::class.java)
val hest = tester.baz(UUID.fromString("7a949c0e-28db-424a-a449-b118e5175a3b"))
LOGGER.info { "hest $hest" }
}
์๋
ํ์ธ์ ํ ๋ฅด,
์ฐ๋ฆฌ๋ ๋งค์ฐ ์ ์ฌํ ๊ตฌ์ฑ์ด ๋ฐ๋๋ผ Java์์ ์๋ํ๋์ง ํ
์คํธํ์ต๋๋ค. https://github.com/jdbi/jdbi/blob/master/sqlobject/src/test/java/org/jdbi/v3/sqlobject/TestSqlObject.java#L293 - L307
์๋ง๋ ์ฐ๋ฆฌ๋ Kotlin ์ฌ๋ก๋ฅผ ๋์ณค์ ๊ฒ์
๋๋ค. ์ฌ๊ธฐ์ ์ฌ์ฉ์ ํด๋นํ๋ ํ
์คํธ๋ฅผ ์ถ๊ฐํ๊ณ ๋ฐ๊ฒฌ๋ ๋ฒ๊ทธ๋ฅผ ์์ ํด์ผ ํฉ๋๋ค.
์, ๋ ์์ธํ ์ดํด๋ณด๋ฉด ๋ฐํ ์ ํ ์ด Object
๋ UUID
์ ๋ค๋ฆ
๋๋ค. ์ด๊ฒ์ Kotlin ์ปดํ์ผ๋ฌ๊ฐ ์ฐ๋ฆฌ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ ํฉ์ฑ ๋ธ๋ฆฌ์ง ๋ฉ์๋๋ฅผ ๋ด๋ณด๋ด๊ณ ์์์ ์๋ฏธํฉ๋๋ค.
Google์ ๊ฒ์ํ๋ ์ฌ๋๋ค์ ๊ฒฝ์ฐ ์ด ๋ฒ๊ทธ๋ ์์ ์ธํฐํ์ด์ค์ ์ฃผ์์ด ๋ฌ๋ ค ์์ง ์์ ๋ ๋ค๋ฅธ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์์ฑํฉ๋๋ค(์ฐพ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ ธ์ต๋๋ค!)
Exception in thread "main" java.lang.IllegalStateException: Method StringRepo.get must be default or be annotated with a SQL method annotation.
at org.jdbi.v3.sqlobject.SqlObjectFactory.lambda$buildMethodHandler$15(SqlObjectFactory.java:148)
...
interface Repo<T> {
fun get(): T
}
interface StringRepo : Repo<String> {
@SqlQuery("SELECT 'Hello world!'")
override fun get(): String
}
//...snip
jdbi.onDemand(StringRepo::class.java).get()
@LittleMikeDev , ๊ทธ๊ฒ์ ์ฝ๊ฐ ๋ค๋ฅธ ๋ฌธ์ ์ ๋๋ค. : ๋๋ ์ฃผ์์ ๋๋ฝ ๋ ํด๋์ค์ ๋ํด ์คํด์ ์์ง๊ฐ๋์ง ๋ฉ์์ง ์ค๋ฅ ๊ฐ์ ํ์ต๋๋ค https://github.com/jdbi/jdbi/pull/1590/files#diff -75b1c04d402bd8924262c7fececfcdb1L166์
@TorRanfelt , ๋๋ ์ด๊ฒ์ ๋ํด ์กฐ๊ธ ๋ ํ๊ณ ๋ค์๊ณ ๊ทธ๊ฒ์ ๊ณ ์น๊ธฐ ์ํด ๋ฌด์์ํด์ผํ ์ง ๋ถ๋ช ํ์ง ์์ต๋๋ค. Kotlin ์ปดํ์ผ๋ฌ๊ฐ ๊ณต๋ณ ๋ฉ์๋ ์ ๋ฌธํ์ ๋ํ ๋ธ๋ฆฌ์ง ๋ฉ์๋๋ฅผ ๋ด๋ณด๋ด์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. Kotlin ๋ฒ๊ทธ ์ถ์ ๊ธฐ์ ๋ฌธ์ ๋ฅผ ์ ์ถํ์ต๋๋ค: https://youtrack.jetbrains.com/issue/KT-33634
ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก Jdbi๋ ํ์ํ ๋ธ๋ฆฌ์ง ๋ฐฉ๋ฒ์ ์๋ฎฌ๋ ์ดํธํ ์ ์์ต๋๋ค. ํ์ํ ์ฝ๋๋ ์๋ง๋ ์์ง๋ง ์์ฑํ๊ธฐ๊ฐ ๋งค์ฐ ๊น๋ค๋กญ์ต๋๋ค. Kotlin์ด ์ต์ํ ์ด ๋ฌธ์ ๋ฅผ ๊ณง ํ๊ฐํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@stevenschlansker ์กฐ์ฌํด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค.
Kotlin์ด ์๋ํ๋ ๊ฒ์ ๋ณด์๊ธฐ ๋๋ฌธ์ ์ด์ ์ ์ด ๋ธ๋ฆฌ์ง๊ฐ ์์์ ๊ฒ์
๋๋ค. - ์ด๊ฒ์ ์ด์ ๋ฒ์ ์ JDBI๋ก ๋๋๋ ค๋ ๋ค์ ์๋ํ์ง ๋ชปํ๋ ์ด์ ๋ฅผ ์ค๋ช
ํฉ๋๋ค.
์ด๊ฒ์ Java 6 ํธํ์ฑ์ ์ ์งํ๊ธฐ ์ํ ์ ์ถฉ์์ธ ๊ฒ ๊ฐ์ต๋๋ค. 6์ ์ธํฐํ์ด์ค์์ ๋ธ๋ฆฌ์ง ๋ฉ์๋๋ฅผ ์ง์ํ์ง ์์ผ๋ฏ๋ก Kotlin์ ์ด๋ฅผ ๋ด๋ณด๋ด์ง ์์ต๋๋ค. ์ค๋๋ ์๋ ์ด๋ฆฌ์๊ฒ ๋ค๋ฆด์ง ๋ชจ๋ฅด์ง๋ง 10๋ ์ ์๋ ์๋ง๋ ๋ง์ด ๋์์ ๊ฒ์ ๋๋ค. ;) ๋ฐ๋ผ๊ฑด๋ ๊ทธ๋ค์ด ๊ณง 6 ์ง์์ ์ค๋จํ๊ฑฐ๋ ์ ์ด๋ ์กฐ๊ฑด๋ถ๋ก 6 ์ดํ ์ธ๊ณ์์ ํธํ์ฑ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์๋ ํ์ธ์ ํ ๋ฅด,
์ฐ๋ฆฌ๋ ๋งค์ฐ ์ ์ฌํ ๊ตฌ์ฑ์ด ๋ฐ๋๋ผ Java์์ ์๋ํ๋์ง ํ ์คํธํ์ต๋๋ค. https://github.com/jdbi/jdbi/blob/master/sqlobject/src/test/java/org/jdbi/v3/sqlobject/TestSqlObject.java#L293 - L307
์๋ง๋ ์ฐ๋ฆฌ๋ Kotlin ์ฌ๋ก๋ฅผ ๋์ณค์ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์ ์ฌ์ฉ์ ํด๋นํ๋ ํ ์คํธ๋ฅผ ์ถ๊ฐํ๊ณ ๋ฐ๊ฒฌ๋ ๋ฒ๊ทธ๋ฅผ ์์ ํด์ผ ํฉ๋๋ค.