Jdbi: خطأ طرق غامضة (طريقة الجسر المفقودة) للحمل الزائد لمتغير Kotlin

تم إنشاؤها على ٩ أغسطس ٢٠١٩  ·  8تعليقات  ·  مصدر: jdbi/jdbi

تحرير: تم التحديث بمثال أبسط.

وفقًا للوثائق العامة و 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" }
}
bug

التعليق الأكثر فائدة

مرحبا تور ،
لقد اختبرنا أن أعمال إنشاء مشابهة جدًا في Vanilla Java: https://github.com/jdbi/jdbi/blob/master/sqlobject/src/test/java/org/jdbi/v3/sqlobject/TestSqlObject.java#L293 - L307
ربما فاتنا قضية Kotlin. يجب أن نضيف اختبارًا يتوافق مع استخدامك هنا ونصلح أي خطأ تم اكتشافه.

ال 8 كومينتر

مرحبا تور ،
لقد اختبرنا أن أعمال إنشاء مشابهة جدًا في 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

كحل بديل ، يمكن لـ Jdbi محاكاة طريقة الجسر المطلوبة. ربما ينتهي الأمر بالرمز المطلوب إلى أن يكون صغيرًا ولكن يصعب كتابته. آمل أن تقوم Kotlin على الأقل بتقييم المشكلة قريبًا.

stevenschlansker شكرا للنظر في الأمر.
لابد أن Kotlin كان لديه هذا الجسر من قبل لأنني رأيته يعمل. - هذا ما يفسر سبب عدم تمكني من تشغيله مرة أخرى من خلال الرجوع إلى الإصدارات القديمة من JDBI.

يبدو أن هذا كان بمثابة حل وسط للحفاظ على توافق Java 6: 6 لم يدعم طرق الجسر في الواجهات ، لذا فإن Kotlin لا ترسلها. يبدو هذا سخيفًا للغاية في الوقت الحاضر ولكن ربما كان منطقيًا منذ 10 سنوات ؛) نأمل أن يسقطوا 6 دعم قريبًا ، أو على الأقل يتيحون التوافق مع عالم ما بعد 6 بشكل مشروط.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

TechZi picture TechZi  ·  12تعليقات

leaumar picture leaumar  ·  13تعليقات

findepi picture findepi  ·  43تعليقات

jeff-blaisdell picture jeff-blaisdell  ·  20تعليقات

christopheblin picture christopheblin  ·  17تعليقات