Подход странный, но я могу себе представить, когда вам это нужно. (например, вы не пишете в сеанс, а флеш-область не работает в распределенной среде и т. д.). Кстати, если вы не можете использовать область видимости сеанса, подумайте об использовании области видимости flash.
Помимо правильности подхода, попробуйте добавить дополнительное поле к бобу:
protected Long currentId;
public Long getCurrentId() {
return currentId == null ? user.getId() : currentId;//or simply return it, I don't know how you play with the user field
}
public void setCurrentId(Long currentId) {
this.currentId = currentId;
}
Удалите параметр из действия edit
и используйте поле currentId
, и, на ваш взгляд, добавьте параметр (скрытое поле здесь не будет работать):
<f:viewParam name="id" value="#{userController.currentId}" />
Затем в действии вы можете получить идентификатор пользователя из предыдущего представления, просто открывая this.currentId.
И кстати, попробуйте загрузить вашего пользователя из другого места, а не int @PostConstruct. Если вы создаете пользователя в @PostConstruct, то когда вы находитесь в методе редактирования, currentId будет из предыдущего представления, а user.id будет из @PostConstruct. Поэтому, если вы не хотите хранить пользователя в области действия сеанса, а используете только область запроса, вы должны сохранить ее сразу после создания (например, в базе данных). В методе редактирования вы должны вернуть его, используя currentId.