---обновление 2---
Похоже, странная ошибка была вызвана другой странной ошибкой, касающейся порядка запуска пакета. Несмотря на то, что я установил порядок запуска на «проект A, ЗАТЕМ проект B», иногда он запускал его наоборот, тем самым вызывая проблему с ServiceReference. Кажется, теперь наконец-то работает без проблем.
Еще раз спасибо, что уделили время!
---обновить---
После повторного тестирования моей программы сегодня утром проблема внезапно исчезла. Я даже не изменил код на тот момент. После этого я продвинулся довольно далеко со своим сервисом, но пока я пытался решить проблему с загрузкой класса сопоставления, проблема внезапно появилась снова. Перезапуск Eclipse ничего не дал, перезагрузка моего ПК снова решила проблему. Кажется, это никак не связано с моим кодом...
Несколько минут назад мой сервис заработал, я сделал несколько тестовых записей в своей базе данных, все в порядке. Сейчас я работаю над усовершенствованием своего сервиса (предоставляя больше возможностей для взаимодействия с базой данных и т. д.), и проблема снова возникает, хотя я ничего не менял в этой части кода. .
TL;DR:
Похоже, это совершенно случайный баг.
В любом случае, спасибо за ваши ответы. Я рассмотрю эти варианты, если мне когда-нибудь понадобится копнуть глубже в этом вопросе, но сейчас я думаю, что я соглашусь с доказательством того, что моя программа работает, потому что эта спорадическая ошибка не кажется моей ошибкой. (В любом случае, это было просто упражнение, практической пользы от программы для меня нет).
---original--- Итак, я работал над простой службой OSGi, которая использует Hibernate для доступа к базе данных.
--- необязательная стена текста---
Большая часть информации по этой теме кажется довольно устаревшей, главным образом потому, что официальной OSGi-поддержке спящего режима едва исполнился год. Все, что до этого, довольно сложно и не очень полезно. (Я трачу на это довольно много времени, прежде чем сдаться). Руководство для разработчиков по этой теме (http://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch17.html) также довольно скуден (я новичок в Hibernate и OSGi, и это руководство, похоже, ожидает достаточно глубокие знания). Я попытался заставить работать проект быстрого запуска «неуправляемый нативный», но раньше я не использовал maven или karaf и столкнулся с некоторыми проблемами.
После этого я просто попытался интегрировать их HibernateUtil (https://github.com/hibernate/hibernate-orm/blob/4.2/documentation/src/main/docbook/quickstart/tutorials/osgi/unmanaged-native/src/main/java/org/hibernate/osgitest/HibernateUtil.java) в мою собственную программу, но я всегда получаю исключение nullPointerException в этой строке: sf = (SessionFactory) context.getService( sr );
, потому что sr
null
. (sr указывается в строке выше, ServiceReference sr = context.getServiceReference( SessionFactory.class.getName() );
)
---конец текста---
В общем, я наткнулся на это пошаговое руководство в ответе: Интеграция Hibernate и OSGi, он не может загрузить файл конфигурации hibernate, и, похоже, до сих пор он работал хорошо для меня (гораздо меньше работы с зависимостями и необходимыми пакетами), но затем Я добрался до линии ServiceReference<?> ref = context.getServiceReference(SessionFactory.class.getName());
и уже знал, что должно произойти; да, ref
это null
, поэтому он не создаст сеанс.
Найдя несколько других примеров «работающих» служб Hibernate, все они, похоже, создают свои сеансы аналогичным образом, но я не могу найти никого, у кого была бы эта проблема.
Что я делаю неправильно, что может быть причиной этой проблемы? Что-то еще упущено?
примечание: для простоты предположим, что моя программа выглядит точно так же, как в вышеупомянутом ответе. Единственный дополнительный шаг, который я сделал, - это поместить пакет «Проект А» в требуемые Bundes для «B», затем я запускаю пакеты в Eclipse Equinox.
Ошибок нет, но при отладке я могу сказать, что ref
это null
(Очевидно, я намерен немного придумать это, но для этого мне нужно заставить его работать в первую очередь...)