Несколько вкладок или окон браузера с одним и тем же классом bean-компонента ViewScoped

Использование Payara Server 4.1.2.174 с mojarra 2.2.15.

У меня есть простой именованный компонент с областью видимости javax.faces.view.ViewScoped.

import java.io.Serializable;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.faces.view.ViewScoped;
import javax.inject.Named;


@Named
@ViewScoped
public class SimpleBean implements Serializable
{
    private final Logger logger = Logger.getLogger(SimpleBean.class.getName());

    @PostConstruct
    private void init()
    {
        logger.log(Level.SEVERE, "{0}.init()", this);
    }

    private String name;

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public String action()
    {
        logger.log(Level.SEVERE, "{0}.action()", this);
        logger.log(Level.SEVERE,"====================");
        logger.log(Level.SEVERE, "name: {0}", getName());
        logger.log(Level.SEVERE,"====================");
        return "submit";
    }
}

Итак, у меня есть простая страница index.xhtml с формой.

<h:form>
  <h:inputText value="#{simpleBean.name}"></h:inputText>
  <h:link value="To submit" outcome="submit"/>
  <h:commandButton value="Welcome Me" action="#{simpleBean.action()}"/>
</h:form>

Я могу открыть index.xhtml в двух разных вкладках или окнах браузера. Итак, у меня есть следующий журнал:

Severe: [email protected]()
Finest: Handling PostConstructViewMapEvent
Finest: Handling PreDestroyViewMapEvent
Finest: Destroying @viewscoped beans from view map: {simpleBean=solvo.ee.beans.SimpleBean@2adafd68}
Severe: [email protected]()
Finest: Handling PostConstructViewMapEvent
Finest: Handling PreDestroyViewMapEvent
Finest: Destroying @viewscoped beans from view map: {simpleBean=solvo.ee.beans.SimpleBean@49a86248}

Как мы видим, есть два разных экземпляра SimpleBean. После этого я отправляю форму первой вкладки.

Severe: [email protected]()
Severe: ====================
Severe: name: First tab
Severe: ====================
Finest: Handling PreDestroyViewMapEvent
Finest: Destroying @viewscoped beans from view map: {simpleBean=solvo.ee.beans.SimpleBean@2adafd68}
Finest: Handling PreDestroyViewMapEvent
Finest: Destroying @viewscoped beans from view map: {}

Если я попытаюсь отправить форму второй вкладки, сохраненный ранее экземпляр SimpleBean (solvo.ee.beans.SimpleBean@49a86248) не будет использоваться, вместо этого ViewScopeContextManager создаст новый экземпляр класса SimpleBean, как мы можем видеть на журнал:

Severe: [email protected]()
Severe: [email protected]()
Severe: ====================
Severe: name: Second tab
Severe: ====================
Finest: Handling PreDestroyViewMapEvent
Finest: Destroying @viewscoped beans from view map: {simpleBean=solvo.ee.beans.SimpleBean@4797f115}
Finest: Handling PreDestroyViewMapEvent
Finest: Destroying @viewscoped beans from view map: {}

Я проверил код метода com.sun.faces.application.view.ViewScopeContextManager.copyViewScopeContextsFromSession и, как я понимаю, это нормальное поведение. Однако, если я сохраню параметры запроса или другие важные данные в своем bean-компоненте, я потеряю его, потому что экземпляр будет потерян после отправки первой формы.

Есть ли решение, чтобы bean-компонент был связан в первую очередь со второй вкладкой (в моем примере solvo.ee.beans.SimpleBean@49a86248)?


person Artyom Krikheli    schedule 20.12.2017    source источник
comment
Удалось ли вам найти решение для этого случая? У меня точно такой же: stackoverflow.com/questions/52477462/   -  person AndrewG10i    schedule 25.09.2018
comment
Возможный дубликат javax.faces.view.ViewScoped bean-компонента и нескольких вкладок выпуск   -  person Kukeltje    schedule 16.02.2019


Ответы (1)


Кажется, это ошибка с Mojarra, и она будет исправлена ​​в версии 2.3.10 в соответствии с этим сообщением: https://github.com/eclipse-ee4j/mojarra/issues/4509#issuecomment-453188481

Из той же темы видно, что Payara применила патч, не дожидаясь выпуска 2.3.10. Обновление до пропатченной Payara решает проблему для вас?

person Edward    schedule 16.02.2019