Добрый день
Эта проблема была решена при создании 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»