Я разрабатываю простой сервер REST с использованием resteasy 3.0.6.Final, который развертывается в tomcat 7.0.50.resteasy-cdi разрывает развертывание в Tomcat 7
Согласно official doc, есть два основных способа сделать это:
с использованием ServletContainerInitializer, которая реализована в пакете
resteasy-servlet-initializer
.web.xml
и диспетчер сервлетов.
Я пробовал подходы, и они оба работали для меня.
Теперь я хочу, чтобы добавить поддержку CDI с помощью WELD, и для этого мне нужно добавить зависимость
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-cdi</artifactId>
<version>3.0.6.Final</version>
</dependency>
к моей войне/WEB-INF/Lib.
Однако это разрушает развертывание. Tomcat показывает только следующее сообщение об ошибке в catalina.out:
Jan 20, 2014 10:24:06 PM org.apache.catalina.core.StandardContext startInternal
SEVERE: Error filterStart
Jan 20, 2014 10:24:06 PM org.apache.catalina.core.StandardContext startInternal
SEVERE: Context [/storage] startup failed due to previous errors
Есть много предложений в Интернете об удалении Resteasy-КДИ. Таким образом,
- Почему resteasy-cdi нарушает развертывание? Есть ли билет, документирующий проблему?
- Как я могу интегрировать resteasy с WELD в противном случае?
Спасибо за любую помощь.
Update 1
После сеанса отладки, вопрос оказывается очень просто: Resteasy-КДИ нуждается в конкретной реализации CDI для работы, что означает, что я должен включать
<dependency>
<groupId>org.jboss.weld.servlet</groupId>
<artifactId>weld-servlet</artifactId>
</dependency>
в моей сборке.
Еще одно замечание касается конфигурации СВАР, упомянутой в official doc. Когда я включаю эти два слушателя в моем web.xml,
<listener>
<listener-class>org.jboss.weld.servlet.WeldInitialListener</listener-class>
</listener>
<listener>
<listener-class>org.jboss.weld.servlet.WeldTerminalListener</listener-class>
</listener>
я получил следующее сообщение об ошибке в моем localhost.log
Jan 20, 2014 11:55:40 PM org.apache.catalina.core.StandardContext listenerStart
SEVERE: Exception sending context initialized event to listener instance of class org.jboss.weld.servlet.WeldInitialListener
java.lang.IllegalStateException: Singleton is not set. Is your Thread.currentThread().getContextClassLoader() set correctly?
Я не уверен, что если документ является неправильным, но заменяя слушателей с
<listener>
<listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
</listener>
Успешно сделал трюк и военный файл.
Объяснение вашей проблемы, вероятно, будет в «предыдущих ошибках». Проверьте их раньше в журналах. Если их там нет, убедитесь, что ваши настройки ведения журнала не подавляют их и/или временно увеличивают уровень ведения журнала. –
Хорошо, я, наконец, получил все, чтобы работать, добавляя и настраивая сварочный сервлет в свой проект. Кажется, resteasy-cdi нуждается в реальной реализации CDI для работы (что понятно, поскольку оно просто служит мостом). – stackoverflower
@stackoverflower Не могли бы вы разместить ссылку на рабочий код? Я использую ту же самую комбо (RESTEasy + Weld), и мой инъецируемый bean-элемент всегда равен нулю. Мой код немного отличается тем, что он Groovy, построенный с использованием Gradle и развернутый на Jetty, но если это моя проблема, мы вернулись к темному возрасту зависимости поставщика. –