2011-01-27 4 views
0

Используя JSF 2.0 и Spring, я использую управляемый bean-компонент @RequestScope. Этот компонент хранит информацию о зарегистрированном пользователе. Он загружает пользователя из БД в методе @PostConstruct:Жизненный цикл JSF - Выполнять метод управляемого bean-компонента после запроса

@PostConstruct 
public void init() { 
    String username = login.getUsername(); 
    user = userDao.load(username); 
} 

Вошедший в пользователь может вызвать на действие на странице, которая обновляет пользователя в базе данных (с использованием другого управляемого компонента).

Однако фаза @RequestScope сконструирована в начале запроса, который составляет до вызов действия по обновлению. В результате, когда страница перерисовывается, переменная User по-прежнему имеет свои старые значения.

Мой вопрос: есть ли способ запустить мой метод загрузки не в начале запроса, а после запрос был отправлен? Или я имею дело с этим неправильно?

Спасибо за ваше понимание,
Себастьен

ответ

1

Вошедший в пользователь может вызвать на действие на странице, которая обновляет пользователя в базе данных (с помощью другого управляемого компонента).

такой же управляемый bean должен был быть обновлен в этой точке. Если вы по какой-то причине не можете повторно использовать один и тот же управляемый компонент, вам следует вручную сделать это, обратившись к нему в методе действий и вызовите сами сеттеры.


Update: на основе комментариев, вот как бобы должны быть объявлены и введены и используются в вашем конкретном требовании:

@ManagedBean(name="#{login}") 
@SessionScoped 
public class LoginManager { 

    private String username; 

    // ... 
} 

@ManagedBean(name="#{user}") 
@RequestScoped 
public class UserManager { 

    @ManagedProperty(value="#{login}") 
    private LoginManager login; 
    private User current; 

    @PostConstruct 
    public void init() { 
     current = userDAO.find(login.getUsername()); 
    } 

    // ... 
} 

@ManagedBean(name="#{profile}") 
@RequestScoped 
public class ProfileManager { 

    @ManagedProperty(value="#{user}") 
    private UserManager user; 

    public void save() { 
     userDAO.save(user.getCurrent()); 
    } 

    // ... 
} 

<h:form> 
    <h:inputText value="#{user.current.firstname}" /> 
    <h:inputText value="#{user.current.lastname}" /> 
    <h:inputText value="#{user.current.birthdate}" /> 
    ... 
    <h:commandButton value="Save" action="#{profile.save}" /> 
</h:form> 
+0

На самом деле то, что кажется, состоит в том, что компонент запроса создан, затем вызывается другой управляемый bean-компонент и добавляется _another_ Request bean. Затем я изменяю и устанавливаю новое значение моего Пользователя, но это не повлияет на мой первоначальный объект запроса. Есть ли способ передать исходный объект запроса другому компоненту менеджера или получить его? –

+0

Прежде всего: что именно является причиной того, что вы поместили вошедшего в систему пользователя в бланке с запросом? Зачем вам нужно сохранить этот компонент в последующих запросах? Я представил себе, что «логин», как в вашем примере кода, является фактически обработанным сеансом, и таким образом вы гарантируете, что «Пользователь» содержит свежие данные по каждому запросу. Если это не так, то «Пользователь» определенно должен быть компонентом, связанным с сеансом. – BalusC

+0

Действительно. Я храню имя пользователя в компоненте с узлом сеанса и привязываю «пользователь» к запросу, чтобы регулярно обновлять данные. Моя проблема здесь, похоже, в том, что в моем другом управляемом компоненте «пользователь», который я получаю (например, из БД) и модификация, не будет распространяться на компонент с запросом (который уже был сконструирован, когда запрос был запущен, _before_ вызов другого управляемого компонента, который делает некоторую логику на нем) –

Смежные вопросы