EntityManagerFactory не может быть создан в профиле свободы websphere - PullRequest
1 голос
/ 03 апреля 2019

Описание проблемы:

Я пытаюсь перенести веб-приложение из Websphere 8.5.5 в Websphere Liberty Profile (WLP 16.0.0.3) в моей локальной среде Eclipse.Приложение работает нормально в Websphere, но при запуске в WLP я получаю следующее исключение:

Ошибка создания компонента с именем entityManagerFactory: пост-обработка объекта FactoryBean завершилась неудачно;вложенное исключение: java.lang.NoClassDefFoundError: org.apache.openjpa.persistence.query.QueryBuilder

Я ожидаю, что будет присутствовать класс QueryBuilder в реализации opnJPA, предоставляемой средой выполнения Liberty, но по какой-то причине загружается неправильно.Любая помощь будет принята с благодарностью.

Несколько подробностей о конфигурации jpa:

  • Уровень jLP WLP: jpa-2.0

  • Весенняя версия: 3.1.4.RELEASE

  • Компонент EntityManagerFactory: class = "org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"

  • jpaVendorAdapter: class = "org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter"

  • менеджер транзакций: class = "org.springframework.orm.jpa.JpaTransactionManager"

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

Liberty по умолчанию скрывает не-API классы от приложений. В число рассматриваемых API входят Java EE, MicroProfile и некоторые другие. Вы можете открыть его до стороннего API с открытым исходным кодом через конфигурацию.

Конфигурация как это:

<webApplication location="myapp.war">
  <classLoader apiTypeVisibility="+third-party" />
</webApplication>

Учитывая, что вы не привели пример конфигурации вашего сервера или трассировки стека исключения, я не знаю, решит ли это вашу проблему, но это лучшее предложение, основанное на ограниченной информации.

Эта конфигурация может не работать на 16.0.0.3. Поддержка сторонних разработчиков +, возможно, была добавлена ​​совсем недавно (если она не заменяет spec,ibm-api,api,stable,third-party, будет работать, но она более многословна и менее полезна). Я настоятельно рекомендую перейти на более новую версию, поскольку 16.0.0.3 больше не содержит исправлений функций или безопасности. Самый последний выпуск - 19.0.0.3.

1 голос
/ 03 апреля 2019

По умолчанию функция jpa-2.0 предоставляет приложениям только стандартные спецификации пакеты JPA. Он не предоставляет готовые классы, специфичные для реализации JPA.

В вашем случае, поскольку вам необходимо предоставить классы OpenJPA Liberty для вашего приложения (и библиотек внутри вашего приложения, такого как Spring / Hibernate), вы можете включить это с помощью механизма Liberty "api type visibilty".

Я предполагаю, что ваше приложение настроено примерно так в server.xml:

<application location="myApp.war"/>

Чтобы ваше приложение могло видеть сторонние (например, OpenJPA) классы, вы можете сделать это:

<application location="myApp.war">
  <!-- spec, ibm-api, and stable are enabled by default. -->
  <!-- Add third-party to get access to OpenJPA classes from your application -->
  <classloader apiTypeVisibility="spec, ibm-api, stable, third-party"/>
</application>

Официальная документация Liberty: Доступ к сторонним API-интерфейсам

Вам может быть интересно:

Почему Liberty не делает классы third-party, такие как OpenJPA, доступными по умолчанию?

Это потому, что Liberty гарантирует нулевую миграцию, когда все вещи остаются постоянными, а вы просто переходите на более новую версию Liberty. Нулевая миграция, по сути, означает «вам не придется менять какое-либо приложение или конфигурацию при обновлении». Сторонние классы не находятся под непосредственным контролем Liberty и потенциально могут вносить критические изменения в API и, следовательно, нарушать нулевую миграцию. По этой причине Liberty по умолчанию предоставляет только официальные / стандартные API, такие как JavaEE и MicroProfile API.

...