Каковы лучшие приемы отладки с помощью Weld / CDI? - PullRequest
22 голосов
/ 31 января 2011

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

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

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

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

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

Что вы делаете для отладки ваших приложений Weld и насколько это помогает?

Ответы [ 3 ]

9 голосов
/ 07 мая 2011

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

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

Что такое записи пути к классамотсканировано и где?Каков был результат?

Прослушайте ProcessAnnotatedType -Событие

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

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

Что привело к тому, что данный bean-компонент не был рассмотрен позднее?Отдельная банка?

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

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

Weld использует Simple Logging for 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) можно настроить, используя их соответствующие файлы конфигурации и добавляя аналогичные уровни.

3 голосов
/ 31 января 2011

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

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

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

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

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

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

...