تحرير: تم التحديث بمثال أبسط.
وفقًا للوثائق العامة و JDBI يعملان معًا ، وقد رأيت هذا العمل من قبل (وإن كان مع إصدار أقدم من JDBI) ، ولكن لسبب ما تلقيت الآن خطأ:
org.jdbi.v3.sqlobject.UnableToCreateSqlObjectException: يحتوي شريط الواجهة على أساليب غامضة [الملخص العام java.lang.Object Foo.baz (java.util.UUID) ، الملخص العام 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" }
}
مرحبا تور ،
لقد اختبرنا أن أعمال إنشاء مشابهة جدًا في Vanilla 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 ، لقد https://youtrack.jetbrains.com/issue/KT-33634
كحل بديل ، يمكن لـ Jdbi محاكاة طريقة الجسر المطلوبة. ربما ينتهي الأمر بالرمز المطلوب إلى أن يكون صغيرًا ولكن يصعب كتابته. آمل أن تقوم Kotlin على الأقل بتقييم المشكلة قريبًا.
stevenschlansker شكرا للنظر في الأمر.
لابد أن Kotlin كان لديه هذا الجسر من قبل لأنني رأيته يعمل. - هذا ما يفسر سبب عدم تمكني من تشغيله مرة أخرى من خلال الرجوع إلى الإصدارات القديمة من JDBI.
يبدو أن هذا كان بمثابة حل وسط للحفاظ على توافق Java 6: 6 لم يدعم طرق الجسر في الواجهات ، لذا فإن Kotlin لا ترسلها. يبدو هذا سخيفًا للغاية في الوقت الحاضر ولكن ربما كان منطقيًا منذ 10 سنوات ؛) نأمل أن يسقطوا 6 دعم قريبًا ، أو على الأقل يتيحون التوافق مع عالم ما بعد 6 بشكل مشروط.
التعليق الأكثر فائدة
مرحبا تور ،
لقد اختبرنا أن أعمال إنشاء مشابهة جدًا في Vanilla Java: https://github.com/jdbi/jdbi/blob/master/sqlobject/src/test/java/org/jdbi/v3/sqlobject/TestSqlObject.java#L293 - L307
ربما فاتنا قضية Kotlin. يجب أن نضيف اختبارًا يتوافق مع استخدامك هنا ونصلح أي خطأ تم اكتشافه.