Jdbi: توسيع واجهة SqlObject لا يعمل

تم إنشاؤها على ١٤ مارس ٢٠١٨  ·  17تعليقات  ·  مصدر: jdbi/jdbi

توسيع SqlObject لتوفير تنفيذ مخصص كما هو موضح في http://jdbi.org/#_default_methods لا يعمل مع jdbi3-kotlin-sqlobject

interface ListUsersDao : SqlObject {
    fun listUsers(): List<User> {
        return handle.createQuery("SELECT * FROM users")
            .mapToBean(User::class.java)
            .list()
    }
}

val ds = MysqlDataSource()
ds.serverName = System.getenv("DB_HOST")
ds.user = System.getenv("DB_USERNAME")
ds.setPassword(System.getenv("DB_PASSWORD"))
ds.databaseName = System.getenv("DB_NAME")

val jdbi = Jdbi.create(ds)
jdbi.installPlugin(KotlinSqlObjectPlugin())
val handle = jdbi.open()
val dao = handle.attach(ListUsersDao::class.java)
dao.listUsers()

java.lang.IllegalStateException: Method ListUsersDao.listUsers must be default or be annotated with a SQL method annotation.

at org.jdbi.v3.sqlobject.SqlObjectFactory.lambda$buildMethodHandler$11(SqlObjectFactory.java:133)
at java.util.Optional.orElseThrow(Optional.java:290)
at org.jdbi.v3.sqlobject.SqlObjectFactory.buildMethodHandler(SqlObjectFactory.java:133)
at org.jdbi.v3.sqlobject.SqlObjectFactory.lambda$null$9(SqlObjectFactory.java:124)
at java.util.HashMap.computeIfAbsent(HashMap.java:1127)
at org.jdbi.v3.sqlobject.SqlObjectFactory.lambda$methodHandlersFor$10(SqlObjectFactory.java:124)
at java.util.Map.computeIfAbsent(Map.java:957)
at java.util.Collections$SynchronizedMap.computeIfAbsent(Collections.java:2672)
at org.jdbi.v3.sqlobject.SqlObjectFactory.methodHandlersFor(SqlObjectFactory.java:110)
at org.jdbi.v3.sqlobject.SqlObjectFactory.attach(SqlObjectFactory.java:87)
at org.jdbi.v3.core.extension.Extensions.lambda$findFor$0(Extensions.java:71)
at java.util.Optional.map(Optional.java:215)
at org.jdbi.v3.core.extension.Extensions.findFor(Extensions.java:71)
at org.jdbi.v3.core.Handle.attach(Handle.java:505)
...

أفعل شيئا خاطئا ؟ أم أن هذا خطأ في مكان ما في jdbi3 أو jdbi3-kotlin-sqlobject؟

question

ال 17 كومينتر

الحل هو تعريف DAO في جافا

public interface ListUsersDao extends SqlObject {

    @RegisterBeanMapper(User.class)
    default List<User> listUsers()  {
        return getHandle().createQuery("SELECT * FROM users")
            .mapToBean(User.class)
            .list();
    }
}

هل قمت بتثبيت البرنامج المساعد Kotlin-SQLObject؟

لول ، حسنًا ، أرى أنك فعلت ذلك. سأضطر إلى اختبار اتصال اللاعبين الذين عملوا على مواد Kotlin عندما أصل إلى جهاز كمبيوتر

طيب شكرا qualidafial

هذا يزعجني حقًا لأن هذه هي فصول جافا الوحيدة في مشروعي ... :)

لست متأكدًا من أنه مرتبط ولكن ربما يجب عليك أيضًا تسجيل المكون الإضافي Kotlin (غير كائن SQL) أيضًا. ربما ليس فقط في مثال التعليمات البرمجية الخاصة بك.

apatridaFredDeschenesaharin أي تلميحات على ذلك؟

لست متأكدًا مما هو الخطأ - أرى أن KotlinSqlObjectPluginTest لديه اختبار للطرق الافتراضية ، على الرغم من أنه ليس لدينا اختبار باستخدام getHandle() من داخل طريقة افتراضية.

christopheblin ما هو إصدار Kotlin الذي تستخدمه؟

لم أختبر أبدًا ما إذا كانت الطرق الافتراضية تعمل مع getHandle ، دعني ألقي نظرة ...

يعمل بشكل جيد هنا ، هل حاولت إضافة المكوّن الإضافي SqlObject العادي ( jdbi.installPlugin(SqlObjectPlugin())

FredDeschenes omg كيف

تحرير: لا ، لقد تم تثبيته بالتأكيد - نتلقى رسائل خطأ من كائن SQL.

qualidafial : هل يجب أن نضيفه بشكل افتراضي عند إضافة البرنامج المساعد KotlinSqlObject؟

بالمناسبة ، أقوم بإضافة اختبار وحدة مع مكالمة getHandle ، سأتحقق مما إذا كان بإمكاني إعادة هذا.

في الواقع ، كل شيء يعمل كما هو متوقع. أيضًا في kotlin يمكن للمرء استخدام mapTo<User>() بدلاً من mapToBean

كل شيء يبدو أنه لم يتم تثبيت KotlinSqlObjectPlugin .

هذا المكون الإضافي هو ما يسجل KotlinDefaultMethodHandlerFactory والذي يوفر الدعم للطرق الافتراضية في أنواع Kotlin.

qualidafial : لا يبدو لي حقًا أن أعبر هذا ، الخطأ عندما لا يتم تثبيت الإضافات عادة ما يكون org.jdbi.v3.core.extension.NoSuchExtensionException: Extension not found: interface org.jdbi.v3.kotlin.KotlinSqlObjectPluginTest$ThingDao .

christopheblin : ما هو إصدار Kotlin و JDBI الذي تستخدمه؟

حسنًا ، تمكنت من إعادة إنتاج هذا من خلال:

  • تثبيت SqlObjectPlugin العادي
  • عدم تثبيت KotlinSqlObjectPlugin

مشروع الاختبار هنا إذا كنت ترغب في تجربته: https://github.com/FredDeschenes/jdbi-1035-test

christopheblin: سيكون لديك للتأكد من أن مثيل JDBI كنت تستخدم ل .attach دعوة لديه KotlinSqlObjectPlugin تركيب البرنامج المساعد.

اهلا ياجماعة،

شكرا على التحقيقات!

أستطيع أن أؤكد أنني كنت في الموقف الذي وصفته (تم تثبيت SqlObjetPlugin ولكن ليس KotlinSqlObjectPlugin). كان هذا لأنني نسيت تحديث التكوين التجريبي لـ JDBI (وكان الرمز الذي نسخته / لصقته هنا من التكوين "العادي")

في الواقع ، لم يكن الكود الخاص بي يعمل (تحتاج حقًا إلى المكونين الإضافيين) أو لديك الخطأ NoSuchExtensionException

سعيد لأنك وجدت مشكلتك!

qualidafial : لقد

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

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

agavrilov76 picture agavrilov76  ·  5تعليقات

bakstad picture bakstad  ·  5تعليقات

mcarabolante picture mcarabolante  ·  4تعليقات

Romqa picture Romqa  ·  5تعليقات

keith-miller picture keith-miller  ·  3تعليقات