توسيع 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؟
الحل هو تعريف 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 : لقد