我的会话范围bean遇到了奇怪的行为。我使用以下导入和注释来使其成为sessioncoped:
编辑:更多代码
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
@Named
@SessionScoped
public class DetailsBean implements Serializable {
private LinkedHashMap<String, String> folder;
@Inject
private ApplicationBean appBean;
@Inject
private UserBean userBean;
@PostConstruct
public void resolveID() {
this.folder = new LinkedHashMap<String, String>();
for (LinkedHashMap<String, String> tempfolder : appBean.getRepositoryContent()) {
if (tempfolder.get("text:nodeid").equals(URLid)) {
this.folder = tempfolder;
}
}
}
JSF页面的代码片段:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:rich="http://richfaces.org/rich">
<f:metadata>
<f:viewParam name="id" value="#{detailsBean.URLid}" required="true" requiredMessage="You must provide an Object Id"/>
<f:event type="preRenderView" listener="#{detailsBean.resolveID}" />
</f:metadata>
<h:head>
<title>Dataset #{detailsBean.name}</title>
</h:head>
<h:body>
<h:form>
<h:panelGrid columns="2" columnClasses="fixed-column">
Name <h:inputText value="#{detailsBean.name}"
id="name" required="true"
requiredMessage="name required"/>
<rich:message for="name" ajaxRendered="true"/>
</h:panelGrid>
</h:body>
</h:form>
</html>
现在当我点击我的jsf页面中的链接时,这样一个DetailsBean被实例化了。当我点击具有不同内容的另一个链接时,使用相同的bean,因为我仍然在同一个Session中。现在奇怪的是,即使我创建了2个不同的浏览器标签,即使刷新页面后它们也会显示不同的内容。同一个bean实例如何显示不同的内容?我以为通常只有@ViewScoped bean可以实现这个目的吗?不要误会我的意思我希望他们展示不同的内容,所以@ViewScoped将是在这里使用的正确决定,但我只是想知道这是如何可能的......
EDIT2:当我使用javax.faces.ViewScoped时,上面的代码不再起作用了(因为LinkedHashMap,我得到了java.io.NotSerializableException)
答案 0 :(得分:-1)
我相信您在导入行中有错误。 import javax.enterprise.context.SessionScoped;
。您应该从javax.faces.bean.SessionScoped
。