2013-08-31 27 views
1

中定義我在嘗試使用GenericService.resolveName(java.lang.String pName) 會話範圍的模擬錯誤時遇到了上述錯誤。 如果我將範圍更改爲「全局」,則按預期工作。但我需要在原型範圍內有我的組件。那麼,我能做些什麼?錯誤[nucleusNamespace。]在全局範圍內解析組件'''的嘗試無效。它在範圍原型

+0

您使用的是哪個版本的ATG?在你的評論下面你參考ATG 2007.3文檔。原型範圍僅在ATG10.1.1中引入,以應付Endeca墨盒處理程序。你能否給我們提供一個你認爲不起作用的代碼摘錄(和錯誤),以便我們可以幫助你追蹤它。 – radimpe

回答

0

您可能無法從較高範圍對象解析較低範圍組件。

如果您從全局作用域組件調用resolveComponent可能無法解決它。

組件的屬性應始終指向範圍等於或大於其自身的對象。因此,全局作用域組件屬性應該只指向也具有全局作用域的對象;會話範圍組件屬性應只指向具有全局或會話範圍的對象;而請求範圍組件屬性可以指向任何範圍的對象,包括請求。

請仔細閱讀下面

http://docs.oracle.com/cd/E35318_02/Platform.10-1-1/ATGPlatformProgGuide/html/s0205componentscopes01.html

+0

您從文檔中引用的內容對於組件的屬性是正確的(如果我們要在.properties文件中指定它們並使用setter方法注入)。 但我相信我們應該能夠使用GenericService.resolveName()' –

+0

解決更低範圍的組件。我檢查了API文檔,它沒有爲運行時組件解析指定這樣的限制。 http://docs.oracle.com/cd/E23507_01/Platform.20073/apidoc/atg/nucleus/GenericService.html#resolveName(java.lang.String) –

+0

另一種方法是使用atg.servlet.ServletUtil.getCurrentRequest ().resolveName(「yyx」)將解析爲請求與當前線程關聯的作用域組件。但按照文檔「原型」是例外,可以在任何級別解決,一旦解決它將保持本地範圍。 (如果全局組件解決了原型範圍,則組件移至全局範圍)。 – Mouli

1

請確認您的要求ATG文件,以確保你確實有使用原型範圍。

由於我們不知道您的要求,我們無法驗證您嘗試實現的是否是一種好的做法,但是我的2美分來克服您的技術問題是從請求級別開始解決該組件。

如果你有機會到當前請求,做這樣的事情:

request.resolveName(componentName); 

否則,這樣做:

ServletUtil.getCurrentRequest().resolveName(componentName); 

resolveName是計算昂貴的操作,所以它應該只被使用當你沒有任何其他選項時(例如在請求servlet管道中,引用一個請求或會話組件),但是如果必須的話,它將解決你的問題。