2011-01-31 18 views
22

Jedną z piękności z Java EE 6 jest nowa struktura wtrysku zależności - CDI z implementacją Weld reference - która skłoniła nas do rozpoczęcia wewnętrznej migracji do JSR-330 w sposób agnostyczny, z wyraźnym celem, jakim jest możliwość mają słoik rdzenia, który jest zamrożony, a następnie jest w stanie dodać dodatkowe słoiki dostarczające nowe moduły zastępujące funkcje w słoiku rdzenia.Jakie są najlepsze triki do debugowania za pomocą Weld/CDI?

Jestem teraz w trakcie wykonywania powyższej pracy z Weld, i szczerze mówiąc, po prostu za dużo magii dzieje się za osłonami. Albo działa, albo nie, i domyślnie nie zapewnia dużej pomocy w tym, co się dzieje, aby można było zbadać, co jest nie tak i naprawić.

Spodziewam się, że istnieją przełącza się przełącznik, który można łatwo włączyć takie rzeczy jak:

  • Co classpath wpisy są skanowane i gdzie? Jaki był rezultat?
  • Jakie ziarna są dostępne do wstrzykiwań dla jakiej klasy?
  • Co spowodowało, że dane ziarno nie będzie brane pod uwagę później? Dany słoik?

Innymi słowy, muszę zobaczyć proces decyzyjny bardziej szczegółowo. Z jakiegoś powodu nie jest to konieczne z Guice, być może dlatego, że jest o wiele mniej magii i być może dlatego, że komunikaty o błędach są bardzo dobre.

Co robisz, aby zdebugować aplikacje spawalnicze i na ile to pomaga?

Odpowiedz

4

mogę zaproponować kilka opcji:

  • niższy próg logowania. Nie wiem, co rejestrowanie ramy jest używany przez Weld, ale widać, że i konfiguracji, powiedzmy, DEBUG lub INFO

  • pobrać kod źródłowy i umieścić punkty przerwania w realizacji BeanManager (BeanManagerImpl chyba). Jest to główna klasa w CDI i obsługuje prawie wszystko.

  • Spróbuj wstawić inną implementację (jeśli nie jest powiązana z serwerem aplikacji) - na przykład OpenWebBeans. Komunikaty o wyjątkach mogą być lepsze

  • Otwórz specyfikację i przeczytaj o konkretnym przypadku. Często zdarza się, że pominąłeś dany warunek wstępny - na przykład adnotacja musi mieć określony numer @Target, w przeciwnym razie nie jest obsługiwana przez CDI.

Mogę potwierdzić, że wiadomości o wyjątkach z Weld są raczej rozczarowujące. Nie używałem Guice, ale na wiosnę są bardzo, bardzo pouczające. Z Weld musiałem odnieść się do czwartego punktu powyżej (otworzyłem specyfikację) i zweryfikować wszystkie warunki wstępne. To było moje podejrzenie - że chociaż specyfikacja wygląda bardzo dobrze, implementacje nie będą tak błyszczące (przynajmniej na początku). Ale chyba się do tego przyzwyczaić.

+0

Nie jestem związany teraz przez serwer aplikacji. Jest to plan, jak zrobić "zamrożony rdzeń słoika + dodatkowy słoik funkcji" w każdym dostawcy JSR-330, który teraz robię dla CDI. Czy OpenWebBeans ma lepsze raporty o błędach? Czy spojrzałeś na implementację CanDI w Resin? Moja konfiguracja logowania może odciąć dzienniki DEBUG, będę wyglądać. –

+0

Nie miałem żadnego doświadczenia z OWB lub CanDI. Tylko Weld, a właściwie nie za dużo. – Bozho

+0

OpenWebBeans np. rejestruje zeskanowane pliki JAr. Jeśli coś przegapisz, utwórz problem JIRA. Są bardzo innowacyjne i sądzę, że zaimplementują takie funkcje. –

9

Krótka odpowiedź: nie ma dedykowanej opcji debugowania dla CDI (ponieważ nie jest to wymagane przez specyfikację) i nie ma dedykowanej opcji debugowania dla Weld.

Długa odpowiedź: Jest wiele rzeczy, które możesz zrobić samemu.Zapoznanie się z extension mechanism of CDI, a dowiesz się, że można łatwo (naprawdę!) Napisać własne rozszerzenie, które debugs Twój wymagane informacje

Co classpath wpisy są skanowane i gdzie? Jaki był rezultat?

Słuchaj ProcessAnnotatedType -Event

Co ziarna są dostępne do wstrzykiwań dla jakiej klasy?

Wyślij zapytanie do BeanManager.

Co spowodowało, że dana fasola nie była rozważana na później? Dany słoik?

Posłuchaj AfterBeanDiscovery -Event i zobacz, co masz w BeanManager. Zasadniczo następujące scenariusze dokonać ManageBean kwalifikuje się do wstrzykiwań:

+2

Ładne informacje. Czy zdajesz sobie sprawę z tego, że ktoś, kto napisał "upuść to i uzyskaj dużo informacji" - zamiast mnie, musi najpierw wykonać wstępne badania? –

+0

Brak rozszerzenia, o którym jestem świadomy. Zrobiłby miły wkład do Seam/CODI ... –

+0

Nie sądzę, że to działa, ponieważ nie można określić kolejności rozszerzeń. Tak więc rozszerzenie, które jest nazywane później, nadal może zmienić grę. –

3

Weld korzysta Proste rejestrowanie dla Java (sl4j). Jeśli używasz Tomcat, proponuję dodać sl4j-jdk14-x.x.x.jar nałożeniem ścieżce klasy i dołączyć następujące linie do 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 

To będzie generować wiele debugowania w konsoli, więc ty `d lepiej wybrać coś konkretnego i komentować na inne kwestia.

Inne biblioteki rejestrowania (takie jak log4j) można skonfigurować przy użyciu odpowiednich plików konfiguracyjnych i dodać podobne poziomy.

Powiązane problemy