答案 0 :(得分:6)
问题似乎是您声明您的bean是 CDI 托管bean,而不是 JSF 托管bean。 @ViewScoped是一个特定于JSF的范围,CDI本身不支持。
CDI允许您创建自定义范围,因此您可以为其构建支持。事实上,这已经完成了。请参阅:http://seamframework.org/Community/JSF2ViewScopeInCDI
不使用任何扩展程序,以下代码运行良好:
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean
@ViewScoped
public class MyBean {
String state = "";
@PostConstruct
public void test() {
System.out.println("pc called");
state = "state set";
}
public String getState() {
return state;
}
public String action() {
return "";
}
}
以下Facelet:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:body>
#{myBean.state}
<h:form>
<h:commandButton value="test" action="#{myBean.action}"/>
</h:form>
</h:body>
</html>
post构造方法现在只调用一次,按下命令按钮后页面将刷新,但状态将被保留。
答案 1 :(得分:2)
Seam Faces 3为CDI bean提供了@ViewScoped注释,以及大量其他功能,以弥合CDI和JSF之间的差距。
答案 2 :(得分:1)
根据此处发布的建议,我已开始使用MyFaces CODI来解决此问题。我不能告诉你Seam或CODI是否更好,但至少它让我过去试图解开范围并继续编写应用程序。