Реализация EMF работает при вызове из EJB, но не при вызове EJB из WAR.

Эта проблема несколько сложна, и я немного над головой. Я постараюсь описать его максимально кратко.

У меня есть приложение J2EE, которое работает на Glassfish v2 и использует сообщения CCD, используя реализацию EMF (МДГТ). Когда это вызывается из веб-сервиса, который вызывает EJB, он работает отлично и работает уже более года. Недавно у нас была причина вызвать это из WAR, тестовый случай — это пользователь, загружающий тот же файл, который обычно отправляется через веб-сервис. Когда вызываем это из ВОА, то не работает, ЭДС EPackage.Registry пустая!

Когда мы вызываем это из WAR, WAR получает экземпляр сеансового компонента EJB и просто вызывает EJB. Мы хотим сохранить в EJB как можно больше логики, чтобы не дублировать код.

Основано на обсуждении списка пользователей MDHT Меня заставили поверить, что это скорее проблема EMF, чем проблема MDHT, и она связана с тем, какой загрузчик классов используется.

Библиотеки MDHT и EMF упакованы в EJB JAR и видны загрузчику классов EJB.

Я пробовал несколько обходных путей и точек, чтобы сузить эту проблему:

  • переместил JAR-файлы, чтобы увидеть, не связано ли это с тем, что загрузчик классов не может видеть библиотеки MDHT
  • Проверено в отладчике, чтобы увидеть, какие загрузчики классов используются при заполнении реестра.
  • Копался в EMF и искал ClassNotFoundExceptions
  • Установите точку останова для ведения журнала, чтобы увидеть, какой загрузчик классов используется при заполнении реестра. Кажется, он использует загрузчик классов EJB, как и ожидалось.

Существуют ли какие-либо известные или общие случаи использования, когда реализация EMF будет вести себя по-другому при вызове из WAR вместо EJB?

Это действительно проблема EMF или это более общая проблема, когда WAR вызывает EJB?

Какие еще шаги по отладке следует предпринять, чтобы изолировать и определить основную причину этой проблемы?


person Freiheit    schedule 17.11.2011    source источник


Ответы (1)


Решение этой проблемы было найдено на форумах EMF: http://www.eclipse.org/forums/index.php/m/758092/#msg_758092

Если я устанавливаю для системного свойства org.eclipse.emf.ecore.EPackage.Registry.INSTANCE значение org.eclipse.emf.ecore.impl.EPackageRegistryImpl, происходит волшебство, и оно работает.

Мне любопытно, почему это работает, но это другой вопрос.

person Freiheit    schedule 21.11.2011