Я испытываю странное поведение с моим 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;
}
}
}
Фрагмент кода страницы 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. Когда я нажимаю на другую ссылку с другим содержимым, используется тот же компонент, потому что я все еще нахожусь в том же сеансе. Теперь странно то, что, хотя я создал 2 разные вкладки браузера, они показывают разное содержимое даже после обновления страницы. Как один и тот же экземпляр компонента может отображать разное содержимое? Я думал, что обычно только bean-компонент @ViewScoped может достичь этого? Не поймите меня неправильно, я ДЕЙСТВИТЕЛЬНО хочу, чтобы они показывали разный контент, поэтому @ViewScoped было бы правильным решением для использования здесь, но мне просто интересно, как это возможно...
EDIT2: когда я использую javax.faces.ViewScoped, вышеприведенный код больше не работает (тогда я получаю java.io.NotSerializableException из-за LinkedHashMap)