
![[8.5.5.6 或更新版本]](../ng_v8556.gif)
環境定義和相依關係注入 1.2 的行為變更
「環境定義和相依關係注入 (CDI)」1.2 實作有了一些行為變更,可能使得從 CDI 1.0 移轉的應用程式,在 CDI 1.2 中採取不同的行為或者執行失敗。
您可以針對每一個伺服器實例,挑選 CDI 1.0 與 CDI 1.2 特性實作,並將行為變更納入考量。如果必要的行為只有 CDI 1.2 特性才有,您必須使用 CDI 1.2 特性。如果現有的應用程式會因 CDI 1.2 特性中的行為變更,受到不利影響,則使用 CDI 1.0 特性,可保留該應用程式的現有行為。在相同的伺服器中,不可能同時使用 CDI 1.0 和 CDI 1.2 特性,因為這些特性不相容。如果您同時配置這兩個特性,伺服器會產生配置錯誤。
CDI 1.0 特性是以 CDI 的 Apache OpenWebBeans 實作為建置基礎。CDI 1.2 特性是以 CDI 的 Weld 實作為建置基礎。基於這兩種實作的差異,其行為已有所變更。
在 Bean 中使用 @Named 註釋
對於含有 @Named 註釋的類別,指派給該類別的預設名稱是不完整的類別名稱,其中,第一個字母已從大寫變更為小寫。例如,TestBean 會預設為 testBean。在 CDI 1.0 實作中,所有類別名稱都有此行為。Weld 實作遵循 JavaBean 規格,針對開頭是多個大寫字母的類別名稱有了不同的行為。在此情況下,提供給 Bean 的名稱並不會移除任何大寫字母。例如,當使用 JSFTest 時,從 JavaServer Pages (JSP) 仍是呼叫 JSFTest。
交談 ID CID
在 CDI 1.0 實作中,CID 是廣域唯一的。在 CDI 1.2 中,只在 HTTP 階段作業中是唯一的。此行為與 CDI 規格一致,也是 Weld 選擇的使用慣例。如果要取得廣域唯一的 CID,必須呼叫 Conversation.begin,在交談開始時指定。
參照 beans.xml 檔中的綱目
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/beans_1_1.xsd"
如果使用無效的綱目,會在伺服器上造成異常狀況錯誤。您可以設定 org.jboss.weld.xml.disableValidating=true jvm 內容,一則可關閉 beans.xml 檔的驗證,再者可避免產生錯誤。如果 beans.xml 檔指定了裝飾元或攔截程式,必須使用有效的綱目,否則裝飾元和攔截程式將不會正確實例化。隱含的 Bean 保存檔
CDI 1.2 實作定義了兩種不同類型的 Bean 保存檔:明確和隱含。
- 版本號碼是 1.1(或更新版本),且 bean-discovery-mode 是 all
- 沒有版本號碼
- 是一個空檔案
隱含的 Bean 保存檔是其他任何的保存檔,含有一或多個 Bean 類別,內含一個依照規格「第 2.5.1 節 - Bean 定義註釋」所定義的 Bean 定義註釋,或一或多個 Session Bean。請參閱 Java™ EE 平台的環境定義和相依關係注入規格。
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
bean-discovery-mode="all"
version="1.1">
<cdi12 enableImplicitBeanArchives="false"/>
將這個內容設為
false,可阻止沒有 beans.xml 檔的保存檔成為隱含 Bean 保存檔。