2011-01-05 57 views
1

對於大學項目,我正在使用JSF開發Web應用程序。我的運動是做前端。同學們應該做後端的事情。這兩個部分都是爲了看似應用而設計的。兩者都通過RMI進行通信。我想在部署時打開一次連接。JSF2:如何在部署時啓動服務

我現在要解決這個問題了。我試圖用@ApplicationScoped ManagedBean來做到這一點:

//Constructor of ApplicationScoped ManagedBean 
public Communication() { 
    this.connect(); 
} 

就是這樣嗎?我試過了,但managedBean似乎不叫..

你能建議一個最佳實踐嗎?


@布賴恩:不幸的是我根本就不-.-

@ BalusC的鍋使用EJB: 我創建了一個communicationbean:

@ManagedBean(name="communication") 
@ApplicationScoped 
public class Communication { 

    public static FrontendCommInterface server; 

    public Communication() { 
     this.connect(); 
    } 

然後,我創建了LoginBean:

@ManagedBean 
@ViewScoped 
public class Login { 

@ManagedProperty(value="#{communication}") 
private Communication communicationBean; 

public FrontendCommInterface server; 

private String username; 
private String password; 

public Login() { 
    server = communicationBean.getConnection(); 
} 

public String login(){ 
    HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true); 
    String sessionId = session.getId(); 

    try { 
     server.login(getUsername(), getPassword(), sessionId); 
     return "start.xhtml"; 

    } catch (RemoteException e) { 
     e.printStackTrace(); 
     FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Anmeldung nicht erfolgreich: ", getUsername()+", "+getPassword()+", "+sessionId)); 
     return "login.xhtml"; 
    } 
} 

但不幸的是它拋出異常:

com.sun.faces.mgbean.ManagedBeanCreationException: Klasse org.dhbw.stg.wwi2008c.mopro.ui.managedBeans.Login can not be instanciated. 

java.lang.NullPointerException 
    org.dhbw.stg.wwi2008c.mopro.ui.managedBeans.Login.<init>(Login.java:28) 

調試後,我發現我的ManagedProperty是空的!它尚未創建!怎麼做?我認爲通過managedproperty引用會創建它 - 。

回答

1

託管bean只有在EL #{managedBeanName}引用時纔會自動創建,這可以通過訪問原樣進行,也可以通過作爲託管屬性注入來實現的另一個bean,或者被例如手動EL解析Application#evaluateExpressionGet()

在你的特定情況下,你實際上想要在webapp的啓動過程中初始化一些東西。你寧願爲此使用ServletContextListener

@WebListener 
public class Config implements ServletContextListener { 

    public void contextInitialized(ServletContextEvent event) { 
     // Do stuff during webapp's startup. 
    } 

    public void contextDestroyed(ServletContextEvent event) { 
     // Do stuff during webapp's shutdown. 
    } 

} 

你甚至可以預先創建有一個應用程序範圍的託管bean在必要時(如果你的目的是爲了能夠通過@ManagedProperty其他豆類訪問)。

public void contextInitialized(ServletContextEvent event) { 
     event.getServletContext().setAttribute("bean", new Bean()); 
    } 

JSF存儲應用程序作用域的豆類作爲ServletContext的屬性和JSF不會自動創建另一個當一個已經存在的,所以一個和上述的代碼示例創建一樣將被用於由JSF也是如此。

+0

嘗試簡單的方法,並把託管物業放在那裏,但沒有 不工作-.- – Sven 2011-01-09 11:22:17

+0

託管的屬性設置* * *後的bean建設,而不是*之前*。你需要'@ PostConstruct'來訪問它們。用'@PostConstruct public void init()'替換'public Login()'。 – BalusC 2011-01-09 12:05:29

0

如果您可以在Web應用程序中使用EJB 3.1 lite {1},那麼您可以使用Singleton Session Bean,使用@Startup和@PostConstruct方法進行註釋。我有一個看起來像:

@Singleton 
@Startup 
public class CachePrimer { 

    @PostConstruct 
    public void loadOpenRequests() { 
     ... 
    } 
} 

{1}:EJB 3.1精簡版包含在JavEE 6 Web Profile中,並通過網絡配置文件服務器,例如GlassfishJBoss 6Resin提供。在使用這樣的Web配置文件服務器時,只需將您的EJB包含在.war文件中,無需額外的工作。

相關問題