Можно было бы больше прояснить проблемы загрузчика классов с «не содержит ObjectFactory.class или jaxb.index» - PullRequest
2 голосов
/ 17 февраля 2012

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

Я работаю с приложением, которое использует файл JAR с JAXB-аннотированными классами, сгенерированными изXJC.Файл jar содержит классы ObjectFactory в каждом соответствующем пакете.

Приложение развертывается в стандартном формате EAR и развертывается в WebLogic.У веб-приложений есть веб-контент, но все фляги, используемые веб-модулями и модулями "ejb" (у которых фактически нет ejbs), находятся в общем каталоге lib в EAR.

в JAXBклассы используются уровнем интеграции для вызова набора веб-сервисов.Страницы JSP ссылаются на классы, которые в конечном итоге вызывают этот уровень интеграции, хотя также выполняются фоновые задачи, которые также ссылаются на уровень интеграции.

В большинстве случаев все это работает нормально.Однако в некоторых случаях вызовы, которые инициируются из внешнего интерфейса, завершаются неудачно с такими ошибками:

javax.xml.bind.JAXBException: "..." не содержит ObjectFactory.class или jaxb.index

После небольшого поиска мне удалось найти случайный ответ на пост в блоге на Аннотированные классы JAXB , который привел меня к решению.На нашем уровне интеграции мы создаем JAXBContext для желаемого пакета.Ключ переопределял загрузчик классов по умолчанию в вызове "JAXBContext.newInstance ()", чтобы использовать загрузчик классов служебного класса на уровне интеграции.

WebLogic, возможно, как и другие серверы приложений, создает иерархию загрузчиков классов, такую, чтовеб-модуль загружается одним загрузчиком классов, а модули ejb загружаются другим загрузчиком классов.Классы, загруженные в загрузчик классов веб-модуля, могут вызывать классы в загрузчике классов ejb, но не наоборот (здесь это не имеет значения).

Я предполагаю, что ошибка произойдет, когда служебный класс в интеграцииУровень вызывается косвенно классом, который сначала загружается загрузчиком классов веб-модуля, в отличие от загрузчика классов модуля ejb.Служебный класс в слое интеграции, вероятно, изначально загружается загрузчиком классов модуля ejb (хотя мне интересно, случайно ли это).Изменяя загрузчик классов, используемый в "JAXBContext.newInstance ()" на загрузчик классов модуля ejb, он позволяет находить ObjectFactory.

Вот что я понимаю по этому поводу.Я все еще хотел бы понять это лучше.Например, мне не совсем понятно, почему именно класс ObjectFactory не виден загрузчику классов веб-модуля.

...