Jsf @SessionScoped bean具有@ViewScoped行为

Jsf @SessionScoped bean具有@ViewScoped行为,jsf,jakarta-ee,jsf-2,javabeans,scopes,Jsf,Jakarta Ee,Jsf 2,Javabeans,Scopes,我在会话范围的bean中遇到了奇怪的行为。我使用以下导入和注释使其成为会话范围: 编辑:更多代码 import javax.enterprise.context.SessionScoped; import javax.inject.Named; @Named @SessionScoped public class DetailsBean implements Serializable { private LinkedHashMap<Str

我在会话范围的bean中遇到了奇怪的行为。我使用以下导入和注释使其成为会话范围:

编辑:更多代码

    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;
          }
        }
    }
import javax.enterprise.context.SessionScoped;
导入javax.inject.Named;
@命名
@会议范围
公共类DetailsBean实现了可序列化{
私有LinkedHashMap文件夹;
@注入
私有应用程序Bean appBean;
@注入
私有用户bean用户bean;
@施工后
公共无效解析ID(){
this.folder=新建LinkedHashMap();
对于(LinkedHashMap 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>

数据集#{detailsBean.name}
名称
现在,当我在jsf页面中单击一个链接时,这样一个DetailsBean会被实例化。当我单击另一个具有不同内容的链接时,会使用相同的bean,因为我仍然在同一个会话中。奇怪的是,即使我创建了两个不同的浏览器选项卡,它们在刷新页面后也会显示不同的内容同一个bean实例显示不同的内容?我想通常只有@ViewScoped bean才能实现这一点?别误会,我确实希望它们显示不同的内容,所以在这里使用@ViewScoped将是正确的决定,但我只是想知道这怎么可能


EDIT2:当我使用javax.faces.ViewScoped时,上面的代码不再工作(由于LinkedHashMap,我得到了java.io.NotSerializableException)

我相信您在导入行中有错误。
导入javax.enterprise.context.SessionScoped;
。您应该从
javax.faces.bean.SessionScoped
导入注释,这应该是不可能的,但是如果您的支持者中有一些您不知道的逻辑,那么这是可能的。请发布更多代码。好的,我编辑了。jsf页面上的内容使用文件夹映射并从中获取字符串。您可以发布使用此支持bean的视图代码片段吗?我发布了…但似乎只有视图不正确。当我在详细信息站点上进行更改时,只有最后加载的站点被更新。IP是通过CDI
@Named
管理bean,而不是jsf
@ManagedBean
。即使如此,如果导入确实是错误的,它也会默认为请求作用域,因此肯定不会像视图作用域那样。