2011-01-31 4 views
22

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

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

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

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

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

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

ответ

4

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

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

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

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

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

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

+0

Я не привязан прямо к серверу приложений. Это чертежи о том, как сделать «замороженный ядро ​​ядра + дополнительный баннер функциональности» в каждом поставщике JSR-330, который я сейчас делаю для CDI. Имеет ли OpenWebBeans лучшую отчетность об ошибках? Вы взглянули на реализацию CanDI в Resin? Моя конфигурация регистрации может обрезать журналы DEBUG, я посмотрю. –

+0

У меня не было опыта работы с OWB или CanDI. Только Свард, и не слишком много на самом деле. – Bozho

+0

OpenWebBeans, например. регистрирует отсканированные файлы JAr. Если вы пропустите что-то, создайте проблему JIRA. Они очень новаторские, и я предполагаю, что они будут реализовывать такие функции. –

9

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

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

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

Слушайте ProcessAnnotatedType -Event

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

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

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

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

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

Хорошая информация. Знаете ли вы кого-либо, кто написал «бросить это и получить много информации» -модуля, вместо того, чтобы мне сначала сделать предварительное исследование? –

+0

Никакого расширения, о котором я знаю. Сделал бы хороший вклад в Seam/CODI, хотя ... –

+0

Я не думаю, что он работает, потому что вы не можете указать порядок расширений. Таким образом, расширение, которое называется впоследствии, может изменить игру. –

3

Weld использует простую регистрацию для 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 

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

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