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 провайдера для проверки 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
в качестве базового кода