2009-09-29 125 views
1

我有一個很簡單的代碼讀取像:爲什麼`@In(create = true)`不能在Seam中創建對象?

@In(create = true) OutletHome outletHome; 

這是工作正常(使用Seam 2.2.0.GA),並且對象被創建,並注射沒有任何問題。但是當我試圖將其更改爲:

@In(create = true) OutletHome deactivationOutletHome; 

它突然停止工作,從而導致異常:

org.jboss.seam.RequiredException:@In屬性要求非空值:customerHome.deactivationOutletHome

什麼可能導致這樣的問題?變量名稱如何相關?我怎麼修復它?

+0

我不相信變量名稱的變化是唯一的變化......是嗎?如果你將它改回outlet首頁,它會起作用嗎? – amorfis 2009-09-29 15:44:42

+0

是的,變量名是唯一的變化。正如答案指出的那樣,這是確切的問題。 – 2009-09-30 10:23:51

回答

5

嘗試,


@In(create = true, value="outletHome") 
OutletHome deactivationOutletHome; 

價值注入你必須是一個Seam組件。當錯過屬性「值」時,假定等於注入的字段名稱。

他人訪問Seam組件方法是:


@In(value="componentName", create = true) 
@In("#{componentName}") 
+0

謝謝。這是我的問題的精確描述。匹配是由變量名完成的,而我曾經認爲它是由類名完成的。 – 2009-09-30 10:20:14

1

這是一個猜測,但是:

如果你必須確保變量名是一樣的,你在你的components.xml文件中聲明的一個。

也許嘗試:

@In(create = true, value="#{outletHome}") 
OutletHome deactivationOutletHome; 
+0

謝謝。這是正確的,並解決了我的問題,但@ cetnar的答案更清晰,更精確。 – 2009-09-30 10:22:03

1

Seam documentation(強調):

默認情況下,Seam會做優先 搜索所有上下文中使用名稱的屬性 或實例變量 正在被注入。您可能希望 明確指定上下文變量名稱 ,例如,使用 @In(「currentUser」)。

我猜你有一個OutletHomeImpl,看起來像:

@Name("outletHome") 
class OutlookHomeImpl implements OutletHome { ... } 

對Seam做注射,變量必須具有相同的名稱,只要你想注入豆。還有其他的方法可以做到這一點,但這是「慣例重於配置」的方式。

+0

謝謝。這是部分正確的,因爲我沒有'Impl'類,但是變量名的註釋引發了我的問題。 – 2009-09-30 10:23:17

1

記住,煤層異常「範式」與配置工作。在這種情況下,例外情況是變量名稱不等於組件的名稱,因此您不得不明確告訴接口正在搜索哪個組件。

這是好事,因爲它可以導致寫更少的代碼,如果你遵循的標準,但它可能會導致像這樣的,如果你不記得發生了什麼幕後一些疑慮:)

相關問題