我有一个无状态的控制器,它负责处理表单。这被定义为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