Задайте используемый класс инициализации фабрики контекста JAXB

я обновил наши проекты (Java EE на основе Websphere 8.5), чтобы использовать новый выпуск внутренней структуры компании (и Ejb 3.х дескрипторы развертывания, а не 2.х из них). С тех пор мои интеграционные тесты терпят неудачу со следующим исключением:

 [java.lang.ClassNotFoundException: com.ibm.xml.xlxp2.jaxb.JAXBContextFactory]

Я могу создать приложение с предыдущей версией фреймворка, и все работает нормально. Во время отладки я заметил, что в ContextFinder (javax.XML.bind) есть два разных поведение:

  1. предыдущая версия (все работает отлично): ни одно из разных мест не вызывает Заводского класса, поэтому заводской класс по умолчанию загружается, который является com.солнце.XML.внутренний.связывать.П2.ContextFactory (определяется как строковая константа в классе).

  2. обновленная версия (ClassNotFound): есть ресурс "META-INF/services/javax.XML.связывать.JAXBContext" будучи успешно загружен и в первой строке читать делает ContextFinder попытка загрузить " com.компания IBM.XML.xlxp2.в JAXB.JAXBContextFactory", который вызывает ошибку.

теперь у меня два вопроса:

  1. что это за ресурс? Потому что внутри нашего уха есть две войны, и ни одна из этих двух не содержит службы папок в своем Каталог META-INF.

  2. откуда может быть это значение в противном случае? Потому что filediff не показал мне новых или измененных свойств файлы.

нет необходимости говорить, что я собираюсь прочитать все о возможностях конфигурации JAXB, но если у вас есть первые идеи о том, что могло пойти не так или помочь мне с этим ресурсом (это реальный файл, который я должен искать?) ID ценю много. Большое Спасибо!

EDIT (в соответствии с комментариями/вопросами):

из любопытства, включает ли ваша структура банки JAXB? Сделал старую версию вашего рамки включают jaxb.свойства?

действительно (я немного удивлен) структура имеет настроенный eclipselink-2.4.1-.jar внутри уха, который включает в себя как реализацию JAXB, так и jaxb.файл свойств, который показывает следующую запись в обеих версиях (тот, который находит фабрику, а также в том, который выдает исключение):

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

Я думаю, что это не имеет ничего общего с текущей проблемой, так как jar остался точно таким же в обоих Уши (что работает/ один с ожиданием)

мне также непонятно, почему старая версия фреймворка когда-либо выбирала com.реализация sun

существует класс javax.XML.связывать.ContextFinder, который отвечает за инициализацию JAXBContextFactory. Этот класс ищет различные placess для существования jaxb.файл свойств или " javax.XML.связывать.JAXBContext" ресурса. Если все эти места не покажите, какую фабрику контекста использовать, загружена фабрика Део, которая жестко закодирована в самом классе:

private static final String PLATFORM_DEFAULT_FACTORY_CLASS = "com.sun.xml.internal.bind.v2.ContextFactory";

теперь вернемся к моей проблеме:

построение с предыдущей версией фреймворка (и EJB 2.х дескрипторы развертывания) все работает отлично). Во время отладки я вижу, что конфигурация не найдена, и поэтому выше упомянутая фабрика по умолчанию загружена.

построение с новой версией фреймворка (и EJB 3.X дескрипторы развертывания, поэтому я могу развернуть), только тестовый случай не работает, но остальная часть функциональности работает (например, я могу отправлять запросы на наш веб-сервис, и они не вызывают ошибок). Во время отладки я вижу, что найдена конфигурация. Этот ресурс называется " META-INF/services/javax.XML.связывать.JAXBContext". Вот наиболее важные строки того, как этот ресурс приводит к попытке загрузить 'com.компания IBM.XML.xlxp2.в JAXB.JAXBContextFactory', который затем бросает ClassNotFoundException. Это упрощенный источник упомянутого javax.XML.связывать.Класс ContextFinder:

URL resourceURL = ClassLoader.getSystemResource("META-INF/services/javax.xml.bind.JAXBContext");

BufferedReader r = new BufferedReader(new InputStreamReader(resourceURL.openStream(), "UTF-8"));

String factoryClassName = r.readLine().trim();  

поле factoryClassName теперь имеет значение ' com.компания IBM.XML.xlxp2.в JAXB.JAXBContextFactory'

потому что это стало супер лагер вопрос я добавил баунти :) Я буду работать над этим весь день и дам вам знать, если будут какие-либо новости.

Обновление/ Решение

этот вопрос был решен. Первоначальная проблема возникла из-за неправильной конфигурации сложных проектов Maven с несколькими моделями, в которых одна зависимость использовала обновленную версию настроенной jar Eclipse link, которая содержала определение для JAXBFactory, недоступного в компоненте, где произошла ошибка. Установка фабрики контекста JAXB в большинстве случаев настраивается с помощью jaxb.файл свойств или файл JAXBContext, содержащий то же определение. Подробный процесс загрузки соответствующего JAXBContextFactory происходит в javax.XML.связывать.ContextFinder.

ошибка еще не решена (во время того, что более 4 основных приложений EE/SE приводят к ошибке), и нет общего ответа, но что определенный JAXBContextFactorys должен существовать в вашем пути к классам (вау, что удивительно...) так что вы либо что ClassNotFound ошибку, потому что вам хватает ресурсов (ну это актуальным причиной) или потому что у вас неправильная JAXBContextFactory определенными в любого из вышеупомянутых свойства файлов, которые содержат определение по ниже Ответ.

очень большое спасибо за ваши замечательные комментарии и поддержку, я очень ценю!

2 ответов


Вы можете включить jaxb.properties файл в том же пакете, что и ваша модель домена, чтобы указать JAXB (JSR-222) реализация, которую вы хотите использовать. Например, это будет выглядеть следующим образом, чтобы указать Бренда EclipseLink как ваш поставщик JAXB.

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

Дополнительные Информация


другое и решение (обходной путь, действительно), которое сработало для меня, - это явно включить реализацию JAXB в сборку maven. Например

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.2.7</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.2.7</version>
</dependency>

обратите внимание, что это добавляет как-то ненужную зависимость к вашей сборке, поскольку JAXB, очевидно, уже является частью каждой JRE >= версии 6.

скорее всего, это будет работать только тогда, когда was classloader установлен в parent last.