2014-01-20 5 views
2

Я разрабатываю простой сервер REST с использованием resteasy 3.0.6.Final, который развертывается в tomcat 7.0.50.resteasy-cdi разрывает развертывание в Tomcat 7

Согласно official doc, есть два основных способа сделать это:

  1. с использованием ServletContainerInitializer, которая реализована в пакете resteasy-servlet-initializer.

  2. 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-КДИ. Таким образом,

  1. Почему resteasy-cdi нарушает развертывание? Есть ли билет, документирующий проблему?
  2. Как я могу интегрировать 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> 

Успешно сделал трюк и военный файл.

+0

Объяснение вашей проблемы, вероятно, будет в «предыдущих ошибках». Проверьте их раньше в журналах. Если их там нет, убедитесь, что ваши настройки ведения журнала не подавляют их и/или временно увеличивают уровень ведения журнала. –

+0

Хорошо, я, наконец, получил все, чтобы работать, добавляя и настраивая сварочный сервлет в свой проект. Кажется, resteasy-cdi нуждается в реальной реализации CDI для работы (что понятно, поскольку оно просто служит мостом). – stackoverflower

+0

@stackoverflower Не могли бы вы разместить ссылку на рабочий код? Я использую ту же самую комбо (RESTEasy + Weld), и мой инъецируемый bean-элемент всегда равен нулю. Мой код немного отличается тем, что он Groovy, построенный с использованием Gradle и развернутый на Jetty, но если это моя проблема, мы вернулись к темному возрасту зависимости поставщика. –

ответ

1

Я спросил об ошибке Singleton is not set в official weld forum, и это ошибка в документах. Как и вы, вы должны использовать «оригинал» org.jboss.weld.environment.servlet.Listener.

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