2015-12-22 2 views
1

Использование Websphere Liberty Профиль 8.5.5.7 с функциямиWebsphere Liberty ClassNotFoundException во время проверки

  • beanValidation-1.1 включен
  • jpa-2.1отключил

Реализация спящего режима JPA-2,0 в настоящее время загружаемый как зависимость проекта хотя в проекте. Оценщик autowired по рамкам Spring аналогично

Validation.byDefaultProvider() 
    .configure() 
    .buildValidatorFactory() 
    .getValidator() 

Кажется, что он настраивает проходимый распознаватель по умолчанию, который дополнительно делегирует работу в JPA проходимого распознаватель, как у меня есть JPA API в пути к классам. Тем не менее, при выполнении проверки на объект он не работает с ClassNotFoundException: javax/persistence/Persistence из-за использования этого класса в org.apache.bval.jsr.resolver.JPATraversableResolver:34.

Кажется, что ошибка WebSphere связана с загрузчиками классов, но, возможно, я должен инициализировать проверку другим способом?

Нет такой проблемы, хотя при включении функции jpa-2.1 в Websphere.

+0

Если вы хотите приложений чтобы иметь видимость для классов 'javax.persistence. *', вам необходимо включить функцию * some * jpa. Когда вы говорите, что вы отключили 'jpa-2.1', включите ли вы' jpa-2.0'? Эти функции должны обеспечивать классы JPA. –

+0

Я загружаю 'jpa-2.0' как зависимость от Maven, а не как функцию Websphere. Похоже, что из-за этого есть частичная видимость 'javax.persistence. *'.Я ожидаю, что Websphere либо вообще не увидит его из кода проверки компонента, либо увидит его в обоих местах - инициализация валидатора и сама проверка. – Gedrox

+0

попробуйте добавить ' jpa-2.0' на ваш server.xml, который должен решить вашу проблему. –

ответ

0

Проблема заключается в том, что javax.persistence.* предоставляется во время компиляции через зависимость от Maven, но это не переносится на время выполнения сервера.
Чтобы обеспечить серверу время выполнения, необходимо включить jpa-2.0 или jpa-2.1 в файле server.xml, или вы можете написать функцию пользователя, которая предоставляет javax.persistence.*.

В упомянутых вами комментариях вы не хотели иметь две реализации JPA на вашем пути к классам. По умолчанию jpa-2.0 предоставит вам реализацию OpenJPA, а jpa-2.1 предоставит вам реализацию EclipseLink. Тем не менее, вы можете переопределить это, поэтому в вашем пути к среде выполнения есть только одна реализация JPA. Поскольку вы используете Hibernate, вы все равно можете включить jpa-2.0 или jpa-2.1 и переопределить провайдера, чтобы только один Реализация JPA будет доступна на время выполнения сервера.

Смотрите эту статью о том, как установить Hibernate быть поставщиком JPA для Свободы:
Hibernate JPA sample: Using an alternative JPA provider
имеет образец server.xml и веб-приложения, в том числе источника, который должен служить хорошим примером.

Ключевым моментом здесь является то, что вы указать это в server.xml:

<jpa defaultPersistenceProvider="org.hibernate.ejb.HibernatePersistence" /> 

ИЛИ, вы указываете это в persistence.xml:

<provider>org.hibernate.ejb.HibernatePersistence</provider> 
+0

Возможно, это проблема Websphere, но я не могу установить функцию jpa-2.0. – Gedrox

+0

Не удается установить или включить? Функция jpa-2.0 должна быть включена в базовое изображение 8.5.5.7. Вам не нужно устанавливать ничего лишнего. –

+0

Кажется, я не смог установить эту функцию из-за отсутствия конфигурации прокси-сервера. Но вы честно думаете, что это дефект Websphere, который выполняется при загрузке классов в соответствии с конфигурацией проверки компонентов и во время выполнения? – Gedrox

Смежные вопросы