2013-07-01 95 views
1

這個問題可能是answred上SO已經但是我沒有管理,使其工作自己...Liferay的門戶和相對路徑

我有一個Liferay的Portlet的,我想讀一些config.xml文件時,此portlet初始化(重新部署)。然而,我似乎無法得到從Java的portlet的相對(或絕對)路徑... This question是一種接近我正在解決的問題,但URL不工作了...

當我打電話

String path = getPortletContext().getRealPath("someDirectoryExample"); 
在出現問題後的方法

是初始化,它的工作原理,但我想這樣做的portlet的構造函數中(=在初始化階段)。然而,這結束與此極長例外連勝:

09:43:43,905 INFO [STDOUT] Caused by: java.lang.IllegalStateException: Config is null, please ensure that your init(config) method calls super.init(config) 

09:43:43,905 INFO [STDOUT]  at javax.portlet.GenericPortlet.getPortletContext(GenericPortlet.java:463) 

09:43:43,905 INFO [STDOUT]  at com.logic.PortletVisual.<init>(PortletVisual.java:23) 

09:43:43,905 INFO [STDOUT]  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
... 

這將是完全好的,如果我可以把XML文件的某處在文檔根目錄或任何其他目錄,並使用相對路徑,但Java類做沒有找到該文件,即使我將它複製到任何地方......(默認路徑是服務器的bin目錄 - JBossAS,但我想將此文件保存在我的portelt目錄中)。

感謝您的任何提示!

編輯:不要被例外困惑。當我不試圖在構造函數中調用getRealPath()函數時,一切工作正常!

回答

2

首先,「Portlet構造器」不是「初始階段」,init()是「初始階段」。

此外,請注意,沒有人保證getRealPath實際返回有意義的值 - 請參見its javadoc。您在例外情況中給出的消息表明,您的init()代碼應先調用super.init(),然後假定該框架確實設置了portletContext。

+0

夠公平的,謝謝你讓我更清楚。但是,有沒有辦法在portlet的構造函數中訪問資源(如XML文件)?如果是這樣,該怎麼辦?如果沒有,是否有其他選擇?這是最麻煩的事情,我還沒有找到關於這個的任何教程......此外,這種異常只發生在試圖在構造函數中獲取路徑時,所有其他事情都可以正常工作! – Smajl

+2

爲什麼只有在構造函數中才能通過各種各樣的箍環?生命週期文檔明確指出init()將在任何其他有意義的操作之前被調用。您正在使用框架 - 使用該框架的默認操作模式。它會讓你的生活變得更容易,但更重要的是:如果他們能夠陳述框架的標準假設並假設他們得到尊重,它將使每個未來維護者的生活變得更加容易。 –

+0

你是對的,我對所有這些「portlet」的東西都很陌生:-)我會嘗試在init()函數中做到這一點。你知道是否有一些等價於getRealPath()的功能對我的問題更好嗎? – Smajl