@ViewScoped bean воссоздается при каждом обращении с обратной связью при использовании JSF 2.2

У меня проблема, подобная этой статье, и ответ от @BalusC на 3 решения, но:

  • Я не использую упомянутые EL выражения
  • Я не хочу идти со вторым решением (для меня это достаточно сложно)
  • а для частичного сохранения состояния установлено значение false.

Мой код выглядит следующим образом:

index.xhtml :

     Insert title here    

...

MenusBean.java :

 package menus; import java.io.Serializable; import java.util.HashMap; import java.util.Map; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import javax.faces.view.ViewScoped; @ManagedBean @ViewScoped public class MenusBean implements Serializable{ private static final long serialVersionUID = -7793281454064343472L; private String mainPage="sub1_menu1"; private Map active; public MenusBean(){ System.out.println("MenusBean created"); active = new HashMap(); active.put(mainPage, true); active.put("sub1_menu2", false); } public boolean activateMenu(String page){ active.put(mainPage, false); active.put(page, true); mainPage = page; for (Map.Entry e : active.entrySet()) System.out.println(e.getKey()+":"+e.getValue()); return true; } public Map getActive() { return active; } } 

Когда выполняется, я получаю:

 Создано меню MenusBean
 Создано меню MenusBean
 Создано меню MenusBean

Как это вызвано и как я могу его решить?

Эта,

 import javax.faces.view.ViewScoped; 

представляет собой JSF 2.2-введенную CDI-специфическую аннотацию, предназначенную для использования в сочетании с CDI-специфической аннотацией управления @Named .

Тем не менее, вы используете JSF-специфическую аннотацию управления @ManagedBean .

 import javax.faces.bean.ManagedBean; 

Затем вы должны использовать любую область, предоставленную тем же javax.faces.bean пакетом javax.faces.bean . Правый @ViewScoped находится там:

 import javax.faces.bean.ManagedBean; import javax.faces.bean.ViewScoped; @ManagedBean @ViewScoped public class MenusBean implements Serializable{ 

Если вы используете неправильную комбинацию, bean ведет себя как @RequestScoped и воссоздается при каждом вызове.

В качестве альтернативы, если ваша среда поддерживает CDI (GlassFish / JBoss / TomEE с Weld, OpenWebBeans и т. Д.), Вы также можете заменить @ManagedBean на @Named :

 import javax.inject.Named; import javax.faces.view.ViewScoped; @Named @ViewScoped public class MenusBean implements Serializable{ 

Рекомендуется перейти на CDI. Специфические для JSF annotations управления компонентами являются кандидатами на устаревание в будущих версиях JSF / Java EE, поскольку все медленно перемещается / объединяется в направлении CDI.

Interesting Posts

Остановить Visual Basic 6 от замены моего корпуса

Почему я не могу подключиться к беспроводной сети на ubuntu, но Mac в порядке?

Разница между iostream и iostream.h

Почему emplace_back () не использует равномерную инициализацию?

HTML5 Audio не может воспроизводиться через Javascript, если только вручную его не запускать вручную

Удалите группы с менее чем тремя уникальными наблюдениями

Новый для Xcode не может открывать файлы в c ++?

Многостраничная электронная почта с текстом и календарем: Outlook не распознает ics

EF5 Получение этого сообщения об ошибке: Совместимость модели не может быть проверена, поскольку firebase database не содержит метаданных модели

Макрос Vba для копирования строки из таблицы, если значение в таблице соответствует условию

Как я могу освободить место на диске из папки установщика Windows, не убивая Windows?

Ошибка: «Выбранный файл inf не поддерживает этот метод установки»

Зачем использовать явно бессмысленные инструкции do-while и if-else в макросах?

Мой источник питания скулит, я могу что-нибудь сделать с этим?

RedirectToAction с параметром

Давайте будем гением компьютера.