如果您可以升级到 JSF 2.2,请立即执行此操作。它@ViewScoped
为 CDI 提供了原生注释。
import javax.faces.view.ViewScoped;
import javax.inject.Named;
@Named
@ViewScoped
public class Bean implements Serializable {
// ...
}
或者,安装OmniFaces,它带来了自己的 CDI 兼容@ViewScoped
,包括一个工作@PreDestroy
(在 JSF 上被破坏@ViewScoped
)。
import javax.inject.Named;
import org.omnifaces.cdi.ViewScoped;
@Named
@ViewScoped
public class Bean implements Serializable {
// ...
}
另一种选择是安装MyFaces CODI,它将 JSF 2.0/2.1 透明地连接@ViewScoped
到 CDI。这只会向 URL 添加一个自动生成的请求参数(就像@ConversationScoped
会做的那样)。
import javax.faces.bean.ViewScoped;
import javax.inject.Named;
@Named
@ViewScoped
public class Bean implements Serializable {
// ...
}
如果你真的需要使用@ConversationScoped
,那么你确实需要手动开始和结束它。您需要在对话的最后一步中@Inject
调用和Conversation
调用,通常是重定向到新视图的操作方法。begin()
@PostConstruct
end()
import javax.enterprise.context.Conversation;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Named;
@Named
@ConversationScoped
public class Bean implements Serializable {
@Inject
private Conversation conversation;
// ...
@PostConstruct
public void init() {
conversation.begin();
}
public String submit() {
// ...
conversation.end();
return "some.xhtml?faces-redirect=true";
}
}
也可以看看: