Передать параметр в bean-компонент, связанный с диалоговым окном PrimeFaces Dialog Frameworks

У меня есть шаблон с кнопкой, которая открывает диалог:

<p:commandButton 
      id="roles-button" 
      icon="fa fa-key">
      <f:setPropertyActionListener value="#{user}" target="#{userAdministrationView.selectedUser}" />
      <f:actionListener binding="#{userAdministrationView.openUserRolesDialogWithParameters()}"/>
          <p:ajax 
               event="dialogReturn" 
               listener="#{dialogHandler.showMessage}"
               update=":user-administration-form:user-administration-table" 
               global="false"
          />
</p:commandButton>

Основным компонентом для шаблона (userAdministrationView) является @ViewScoped.

Я хочу передать параметр selectedUser в диалоге. Возможно ли это с использованием Faces.setContext/Request/FlashAttribute, как рекомендовано здесь? Я пытался реализовать это так:

public void openUserRolesDialogWithParameters() {
    Faces.setContextAttribute("user", selectedUser);
    dialogHandler.openDialog("user-roles-dialog");
}

и в диалогах, поддерживающих bean-компонент (тоже @ViewScoped):

@PostConstruct
public void init() {
    this.user = Faces.getContextAttribute("user");
    ...
}

но я получаю null в user, Тот же результат с setRequestAttribute и setFlashAttribute.

Здесь предлагается создать бин @SessionScoped со свойствами, но это решение выглядит для меня не очень актуально. Это единственный способ?

1 ответ

Благодаря BalusC я начал искать в правильном направлении, и я нашел это объяснение. Итак, это работает так:

бэк шаблона:

public void openUserRolesDialogWithParameters() {
    Map<String, Object> sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
    sessionMap.put("user", selectedUser);
    dialogHandler.openDialog("user-roles-dialog", "contentWidth", "500");
}

компонент поддержки диалога:

@PostConstruct
public void init() {
    Map<String, Object> sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
    this.user = (UserModel) sessionMap.get("user");
    sessionMap.remove("user");
    ...
}
Другие вопросы по тегам