Использование Stateful SessionScoped bean-компонента для хранения информации о входе пользователя в JSF-приложение - PullRequest
0 голосов
/ 11 сентября 2018

Добрый день

Эта проблема была решена при создании MCVE (спасибо Kukeltje за то, что заставили меня сделать это :))

См. Ответ, опубликованный ниже, для MCVE, который работает.

@SessionScoped
@Stateful
public class StoringUserInfo implements Serializable {

    private HashMap<String, String> userSettingMap;
    private String userName = "Test";

    public StoringUserInfo() {
        this.userSettingMap = new HashMap<>();
    }

    public void addSetting(String name, String setting) {
        userSettingMap.put(name, setting);
    }

    public String getSetting(String name) {
        return userSettingMap.get(name);
    }

    public HashMap<String, String> getUserSettingMap() {
        return userSettingMap;
    }

    public void setUserSettingMap(HashMap<String, String> userSettingMap) {
        this.userSettingMap = userSettingMap;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String projectName) {
        this.projectName = userName;
    }
}

Затем, например, в одном компоненте @ViewScoped @Named я хочу сделать это:

@Named
@ViewScoped
public class NewProjectView implements Serializable {

    private static final long serialVersionUID = 1L;
    private String userName;
    @Inject private transient StoringUserInfo userInfo;

    public void submitForm(){
        userInfo.setUserName("NEW")
        // return to dashboard
        FacesContext.getCurrentInstance().getViewRoot().getViewMap().clear();
        PrimeFaces.current().ajax().update(":content", ":formHeader:mainMenu", ":formHeader:growl");
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

}

Затем в другом компоненте @ViewScoped @Named я хочу получить сохраненное значение как таковое (попытка подавить ошибку при развертывании приложения из-за того, что @PostConstruct получает нулевые значения)

@Named
@ViewScoped
public class EditProjectView implements Serializable {

    private static final long serialVersionUID = 1L;
    private String userName;
    @Inject private transient StoringUserInfo userInfo;


    @PostConstruct
    public void init() {
        getValues()
    }

    private void getValues(){
    try {
        userName = userInfo.getUserName(); // this must display on form load
    } catch (Exception e) {
        e.printStackTrace();
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

}

Рабочий процесс внутри приложения обеспечивает посещение страницы, которая задает значения, перед страницей / страницами, которым требуются значения,Отладка также правильно показывает это.

Однако, бины @ViewScoped @Named всегда отображают ноль, они никогда не перечитывают значения из бина @SesionScoped?Что мне здесь не хватает?

Установка значения по умолчанию для строки userName в компоненте @SessionScoped @Stateful показывает имя «Test» во второй форме.

Однако обновленное значение никогда не будет полученочитать на форме рендера / загрузки.Таким образом, кажется, что @PostConstruct выполняется только во время развертывания приложения?

Я также добавил это в мой xhtml-файл:

<o:form id="editProjectForm">
        <f:metadata>
            <f:viewAction action="#{editProjectView.getProjectValues}"/>
            <p:ajax update="editProjectFieldSet"/>
        </f:metadata>
        <p:fieldset id="editProjectFieldSet" legend="#{editProjectView.userName}"/>

Но он по-прежнему не запрашивает bean-компонент SessionScoped перед рендерингом.Показывает только начальное значение по умолчанию «Test»

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Если вы используете CDI, обязательно импортируйте javax.enterprise.context.sessionscoped вместо javax.faces.bean.sessionscoped.

0 голосов
/ 12 сентября 2018

Основное различие между двумя версиями:

 1. Replaced <o:form> with <h:form> 

Приложение работает на WildFly 14 с PrimeFaces 6.2.9 и OmniFaces 3.2

0 голосов
/ 11 сентября 2018

попробуйте это:

HttpSession session = request.getSession();

, чтобы вы могли запросить параметр с именем:

String email = (String) session.getAttribute("emailsession");
...