2011-01-31 104 views
22

Java EE 6中的美女之一是新的依賴注入框架 - 帶有Weld參考實現的CDI - 它促使我們以實現不可知的方式在內部開始將內部遷移到JSR-330,明確的目標是能夠有一個核心罐子被凍結,然後能夠添加額外的罐子,提供替換核心罐子中的功能的新模塊。Weld/CDI的最佳調試技巧是什麼?

我現在正在與Weld進行上述工作,坦率地說,封面背後有太多的魔法。它可以工作,也可以不工作,並且默認情況下不會提供很多幫助,因此您可以調查出錯的地方並修復它。

我希望有開關進行切換,可以輕鬆地啓用了諸如:

  • 掃描哪些類路徑條目,在哪裏?結果是什麼?
  • 哪些類可以注入哪些bean?
  • 是什麼導致給定的bean在以後不被考慮?給定的罐子?

換句話說,我需要更詳細地看到決策過程。出於某種原因,Guice沒有這樣需要,也許是因爲魔術少得多,並且可能是因爲錯誤信息非常好。

你會如何調試Weld應用程序,它有多大幫助?

回答

4

我可以建議幾個選項:

  • 下記錄的門檻。我不知道是什麼日誌框架所使用的焊接,但你可以看到和配置,比如說,DEBUGINFO

  • 獲得源代碼,並把斷點在BeanManager實現(BeanManagerImpl也許)。它是CDI的主要課程,幾乎處理所有事情。

  • 嘗試放置不同的實現(如果不綁定應用程序服務器) - 例如OpenWebBeans。它的例外信息可能會更好

  • 打開規範並閱讀有關特定情況。通常情況下,您錯過了某個先決條件 - 例如註釋必須具有特定的@Target,否則它不由CDI處理。

我可以確認Weld的異常消息相當令人失望。我沒有使用過Guice,但是在Spring中它們非常非常豐富。隨着焊接,我不得不參考上面的第4點(打開規格)並驗證所有的先決條件。這是我最初的懷疑 - 即使規格看起來非常好,實現也不會如此閃亮(起初至少)。但我想一個人已經習慣了這一點。

+0

我不是由應用服務器捆綁現在。它是如何做到在每一個JSR-330提供了「凍結核罐子+額外的功能罐子」的藍圖,那我現在所做的CDI。 OpenWebBeans有更好的錯誤報告嗎?你有沒有看過Resin中的CanDI實現?我的日誌記錄配置可能會切斷DEBUG日誌,我會看看。 – 2011-01-31 21:00:43

+0

我還沒有任何OWB或CanDI的經驗。只有焊接,實際上並不太多。 – Bozho 2011-01-31 21:25:42

9

簡答:CDI沒有專門的調試選項(因爲規範沒有這樣的要求),Weld也沒有專門的調試選項。

Long答案:你可以自己做很多事情。熟悉的extension mechanism of CDI,你會發現,你可以很容易地(真的!)寫自己的擴展,調試您所需的信息

什麼類路徑條目被掃描和 在哪裏?結果是什麼?

ProcessAnnotatedType - 活動

什麼豆類可用於注射 爲哪一類?

查詢的BeanManager了點。

什麼導致給定的豆不被 考慮以後?給定的罐子?

AfterBeanDiscovery - 活動,看看您在BeanManager的本事。基本上,在以下情況下作出ManageBean沒有資格注射:

3

焊接使用簡單記錄的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 

這將產生大量的控制檯調試,所以you`d更好地選擇具體的東西,並註釋掉其他線。

其它測井庫(比如​​log4j的)可以使用他們各自的配置文件以及添加相似的水平進行配置。

相關問題