我有一個無狀態的控制器,它負責處理表單。這被定義爲ApplicationScoped
。在我的頁面上,我有一個與支持bean關聯的表單,其定義爲ViewScoped
。JSF 2.0使用不同範圍注入受管理的bean
我時,我想處理表單的錯誤:
serverError: class com.sun.faces.mgbean.ManagedBeanCreationException Unable to create managed bean myController. The following problems were found:
- The scope of the object referenced by expression #{myFormBean}, view, is shorter than the referring managed beans (myController) scope of application
在我的形式:
Name: <h:inputText value="#{myFormBean.name}" id="name" />
<h:commandButton value="Save Name" action="#{myController.processForm}">
<f:ajax render="nameResult" />
</h:commandButton>
Your name is <h:outputText value="#{myFormBean.name}" id="nameResult"/>
控制器:
@ManagedBean
@ApplicationScoped
public class MyController {
@ManagedProperty("#{myFormBean}")
private MyFormBean myBean;
public void processForm() {
System.out.println(myBean.getName());
// Save current name in session
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(
"name", myBean.getName());
}
}
的支持bean:
@ManagedBean
@ViewScoped
public class MyFormBean {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
我可以通過將控制器設置爲SessionScoped來解決這個問題,但由於控制器是無狀態的,所以它不是一個乾淨的方法,所以我不需要每個會話都有一個控制器。整個應用程序的一個控制器應該足夠了。
我有一個Spring MVC的背景,這就是爲什麼我很困惑如何做的事情與JSF 2.0
BalusC是正確的,請不要修改上面的答案以實現應用程序範圍的bean引用視圖範圍的bean。當多個用戶同時引用該應用程序範圍的bean時,它會崩潰。什麼應用程序 - >視圖基本上相當於是一個有狀態的單身人士,這從來沒有一個可行的設計。嘗試重新設計,以便您可以請求 - >查看參考。 – DWoldrich
我要重做我的設計。 – Sydney