Подтвердить что ты не робот

Каковы лучшие отладочные трюки с Weld/CDI?

Одна из красавиц с Java EE 6 - это новая инфраструктура инъекций зависимостей - CDI с эталонной реализацией Weld, которая побудила нас начать внутреннюю миграцию в JSR-330 в агностической реализации, с явной целью быть способным иметь замороженную ядро, а затем добавлять дополнительные банки, предоставляя новые модули, заменяющие функциональные возможности в ядре ядра.

Сейчас я занимаюсь разработкой вышеупомянутой работы с Weld, и, честно говоря, за крышками слишком много волшебства. Либо он работает, либо нет, и по умолчанию он не оказывает очень большой помощи, что происходит, чтобы вы могли выяснить, что не так, и исправить его.

Я бы ожидал, что есть переключатели для переключения, которые могут легко включать такие вещи, как:

  • Какие записи прослеживаются и где? Каков был результат?
  • Какие beans доступны для инъекций для какого класса?
  • Что заставило данный bean не рассматриваться позже? Данная банка?

Другими словами, мне нужно более подробно рассмотреть процесс принятия решений. По какой-то причине это не так необходимо с Guice, возможно потому, что есть гораздо меньше магии, и, возможно, потому, что сообщения об ошибках очень хорошие.

Что вы делаете, чтобы отлаживать приложения Weld и насколько это помогает?

4b9b3361

Ответ 1

Короткий ответ: для CDI нет выделенной опции отладки (поскольку спецификация не требуется), а для Weld нет выделенной опции отладки.

Длинный ответ: вы можете много сделать самостоятельно. Ознакомьтесь с механизм расширения CDI, и вы обнаружите, что можете легко (действительно!) Написать собственное расширение, которое отлаживает ваш необходимый информация

Какие записи в pathpath проверяются и где? Каков был результат?

Слушайте ProcessAnnotatedType -Event

Какие beans доступны для инъекций для какого класса?

Запросите для этого BeanManager.

Что заставило данный bean не быть рассматривается позже? Данная фляга?

Прослушайте AfterBeanDiscovery -Event и посмотрите, что у вас есть в BeanManager. В принципе, следующие сценарии делают ManageBean неприемлемым для инъекций:

  • это не ManagedBean (например, в jar нет beans.xml)
  • он не может считаться управляемым bean (https://docs.jboss.org/weld/reference/1.1.0.Final/en-US/html/beanscdi.html#d0e794)
  • у него нет BeanType (@Type{})
  • он накладывается вето (Seam Solder) или подавляется любым другим механизмом расширения

Ответ 2

Я могу предложить несколько вариантов:

  • понизить порог регистрации. Я не знаю, какая среда ведения журнала используется Weld, но вы можете это увидеть и настроить, скажем, DEBUG или INFO

  • получить исходный код и поставить контрольные точки в BeanManager (возможно, BeanManagerImpl). Это основной класс в CDI и обрабатывает почти все.

  • Попробуйте добавить другую реализацию (если она не привязана сервером приложений) - например OpenWebBeans. Его сообщения об исключениях могут быть лучше

  • Откройте спецификацию и прочитайте о конкретном случае. Часто бывает, что вы пропустили данное предварительное условие - например, аннотация должна иметь конкретный @Target, в противном случае CDI не обрабатывается.

Я могу подтвердить, что сообщения об исключениях Weld довольно разочаровывают. Я не использовал Guice, но в Spring они очень, очень информативны. С Weld мне пришлось сослаться на 4-й пункт выше (открыть спецификацию) и проверить все предварительные условия. Это было мое подозрение изначально - что, хотя спецификация выглядит очень хорошо, реализации не будут такими блестящими (по крайней мере, по крайней мере). Но я думаю, что к этому привыкаешь.

Ответ 3

Weld использует Simple Logging для Java (sl4j). Если вы используете Tomcat, я предлагаю вам добавить sl4j-jdk14-x.x.x.jar в путь класса приложения и добавить следующие строки в apache-tomcat-7.0.x/conf/logging.properties:

org.jboss.weld.Bootstrap.level = FINEST 
org.jboss.weld.Version.level = FINEST 
org.jboss.weld.Utilities.level = FINEST 
org.jboss.weld.Bean.level = FINEST 
org.jboss.weld.Servlet.level = FINEST 
org.jboss.weld.Reflection.level = FINEST 
org.jboss.weld.JSF.level = FINEST 
org.jboss.weld.Event.level = FINEST 
org.jboss.weld.Conversation.level = FINEST 
org.jboss.weld.Context.level = FINEST 
org.jboss.weld.El.level = FINEST 
org.jboss.weld.ClassLoading.level = FINEST

Это создаст много отладки в консоли, поэтому вам лучше выбрать что-то конкретное и прокомментировать другие строки.

Другие библиотеки журналов (например, log4j) могут быть настроены с использованием соответствующих файлов конфигурации и добавления похожих уровней.