2013-07-03 40 views
0

我試圖通過使用方法getResourcePaths() in ExternalContext獲取WAR文件中的資源路徑。但如果該方法被@Schedule調用,該怎麼辦?在這種情況下,FacesContext爲空。如何在沒有FacesContext的情況下獲取資源路徑?

@Schedule(hour = "*", minute = "0,30", second = "0") 
public void foo() { 
    ExternalContext ctx = FacesContext.getCurrentInstance().getExternalContext(); 
    Set<String> resources = ctx.getResourcePaths("/WEB-INF/"); 
    ... 
} 

我知道FacesContext只在請求中有效。還有其他一些竅門嗎?

+3

我希望你不要在你的EJB類中使用'FacesContext'。 –

+0

我在我的資源中有一些xml文檔,我想在EJB服務類中使用它。我不想在我的應用程序中對文件名進行硬編碼。所以我想知道如何以編程方式查詢這些名稱(不使用'FacesContext')。 – Tomestos

回答

1

公約說,在三層軟件架構一層只能訪問底層,但沒有覆層(第二天底層中嚴格三層架構,所有底層在靈活三層建築)。我唯一的例外是Observer Pattern:主題通知所有附屬的觀察者何時數據已被更改。這是由弱參考從主體層到觀察者層進行的。

我對這個問題的解決方案是,我寫了一個應用程序階段監聽器(當然是在UI層),它在應用程序啓動時掃描資源文件夾WEB-INF。這是合法的,因爲應用程序階段偵聽器在面上下文中運行。

直到JSF 2.1爲止,相位監聽器都不是注入目標(請參閱here in stackoverflow)。所以有必要通過JNDI獲取我的EJB引用。 EJB(位於模型層)然後自動實例化。

應用階段監聽器:

@Override 
public void processEvent(SystemEvent e) { 
    if(e instanceof PostConstructApplicationEvent) { 
    try { 
     // getting ejb by jndi 
     InitialContext iCtx = new InitialContext(); 
     EjbService ejbService = (EjbService) iCtx.lookup("java:module/EjbService"); 

     // fetching resources 
     ExternalContext eCtx = FacesContext.getCurrentInstance().getExternalContext(); 
     Set<String> resources = eCtx.getResourcePaths("/WEB-INF/"); 

     // setting resources into ejb 
     ejbService.setResources(resources); 
    } catch(NamingException e1) { 
     e1.printStackTrace(); 
    } 
    } 
} 

非常感謝所有誰在回答我的問題有幫助。

+0

您可能不希望在該方法中使用您的'EJBService'。這意味着服務查找完成*每次*方法被調用,這是有點浪費和不必要的IMO – kolossus

+0

JNDI查找很昂貴,但我認爲這裏沒問題,因爲事件類型「PostConstructApplicationEvent」在應用程序中只觸發一次啓動時間。 – Tomestos

相關問題