RestEasy 3.0.13 на WebSphere 8.5.5: проблема с версией платформы проверки Bean


Вопрос следует далее по этому посту, но его можно свести к следующему : как заставить Hibernate Validator 5 работать с RestEasy? Разве проверка bean 1.1 не требуется для JAX-RS 2.0? Или это будет работать с Bean Validation 1.0)

Я даю информацию в этом посте, которая выходит за рамки моего вопроса, чтобы воспроизвести все шаги, которые я сделал, и ошибки, которые я получил до этого момента, в надежде, что это поможет всем, кто, как и я, хотел бы иметь JAX-RS 2.0 (RestEasy impl) на WAS 8.5.5. Я нашел абсолютно вообще никакого дока, так что вот что я получил.

В настоящее время я пытаюсь переехать из, Джерси 2.xx, JPA 2.1, на Tomcat 7, чтобы успокоиться, было 8.5.5. Я также мог бы попробовать Apache CXF, но столкнулся с другими проблемами.

Я не могу использовать Джерси с CDI в WAS из-за этого: https://java.net/jira/browse/JERSEY-1933

-----УСТАНОВКА----

A) создайте ухо с веб-модулем в RAD

B) в дескрипторе развертывания, для уха, я установил загрузчик класса режим: родителя последний, войны загрузчиком политики : модуль

C) в дескрипторе развертывания для веб-модуля я задаю режим загрузки класса: Родительский последний

Д) инвалидов JAX-РТС двигателя (JAX-РТС 1.1) (добавлен в JVM арг-модель DCOM.компания IBM.в WebSphere.веб-сервисы.DisableIBMJAXWSEngine=true)

Примечание На c) : если я использую parent first, JAX-RS 1.1, который поставляется с WAS, загружается до моего JAX-RS 2.0 jar. Все виды ошибок будут следовать.

Примечание На b) : если я не использую политику загрузчика классов "модуль", но "приложение", я получаю эту ошибку

> Provider org.jboss.resteasy.plugins.servlet.ResteasyServletInitializer
> not a subtype

Я настраиваю сервлет RestEasy в web.xml

<servlet>
    <servlet-name>Resteasy</servlet-name>
    <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>

    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.mydomain.RestEasyConfig</param-value>
    </init-param>

    <init-param>
        <param-name>resteasy.servlet.mapping.prefix</param-name>
        <param-value>/rest</param-value>
    </init-param>

    <init-param>
        <param-name>resteasy.servlet.context.deployment</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>Resteasy</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

В мою войну в WEB-INF были включены следующие jar опционально

  • hibernate-валидатор-5.0.1.Окончательный.jar
  • resteasy-hibernatevalidator-provider-3.0.13.Окончательный.jar
  • одноклассник-0.8.0.jar

Я пока не использую maven, пока не получу POC (доказательство концепции)... так что все эти банки (исключение javax.аннотация 1.2) исходят из загрузки RestEasy 3.0.13.

-----В ЧЕМ ПРОБЛЕМА ------

Проблема, с которой я сталкиваюсь, заключается в том, что когда ReatEasy пытается загрузить свою конфигурацию, она жалуется, что не может найти реализацию проверки. Насколько мне известно, контейнер должен поставляться с реализацией проверки бобов, но RestEasy не может его найти.

> Caused by: javax.validation.ValidationException: Unable to create a
> Configuration, because no Bean Validation provider could be found. Add
> a provider like Hibernate Validator (RI) to your classpath.   at
> javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:271)
>   at
> org.jboss.resteasy.plugins.validation.AbstractValidatorContextResolver.getConfig(AbstractValidatorContextResolver.java:78)

Поэтому я добавляю 3 опциональные банки, перечисленные выше, чтобы обеспечить валидатор гибернации, и удаляю

  • resteasy-validator-provider-11-3.0.13.Окончательный.jar

Тогда я получаю эту ошибку:

class not found : org.hibernate.validator.method.MethodValidator

Поэтому я решил, что это был класс Hibernate Validator 4.3, который, похоже, не существует в спящий валидатор 5. Я пошел дальше, удалил банки Hibernate Validator (classmate + hibernate validators 5) и добавил следующие 2 банки:

  • hibernate-валидатор-4.3.2.Окончательный.jar
  • hibernate-валидатор-аннотация-процессор-4.3.2.Окончательный.jar

Я также удалил эту банку, так как Hibernate validator 4.3 реализует bean validation 1.0.

  • validation-api-1.1.0.Окончательный.jar

И тогда мой сервис hello JAX-RS 2.0 заработал!

Я был в шоке! Разве JAX-RS не нуждается в проверке bean 1.1 для работы?

Как так получается, что RestEasy корабли с Hib. Валидатор 5.Икс и ХИБ.Валидатор, похоже, полагается на Hib Validator 4.Икс?

Есть ли у кого-нибудь подобные проблемы с RestEasy? Какие-нибудь комментарии?

Давайте посмотрим, что еще сломается в ближайшие дни! (Боже, я скучаю по Джерси на Tomcat)

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


Окончательный список банок конечная точка: https://localhost:9445/jaxrs2web/rest/test

Результат:

{
    "response": "OK!"
}
1 2

1 ответ:

Таким образом, получается, что есть 2 провайдера для проверки bean, предоставляемые RestEasy.

A) One for Bean Validation 1.0 using absolutely Hibernate Validator 4.X. Это не имеет ничего общего со спецификацией JAX-RS... Я думаю, что это просто поставщик, как и любой другой.

B) другой для проверки Bean 1.1, который пытается использовать поставщик реализации проверки bean conatainer, используя либо CDI, либо JNDI.

Context context = new InitialContext();
validatorFactory = tmpValidatorFactory = ValidatorFactory.class.cast(context.lookup("java:comp/ValidatorFactory"));

Мне нужно создать своего собственного провайдера, чтобы пользователь мой конкретный (hibernate validator 5.x) реализация Bean Validation 1.1, поскольку реализация containers является 1.0 impl.

Это можно легко сделать, используя org.jboss.resteasy.plugins.validation.AbstractValidatorContextResolver.java в качестве базового кода