Сеанс SEAM или разговорный боб?
Я немного запутался в том, какую область использовать для моего бина с сохранением состояния. В настоящее время у меня есть бин, который доставляет результаты пользователей на страницу xhtml через JSF, бин использует значение по умолчанию (область разговора) с методом @Create, помеченным как @Begin(join=true).... это должно заставить bean-компонент присоединиться к текущему продолжительному диалогу, верно?
Но я обнаружил, что когда пользователь переходит на другую страницу, а затем снова, метод @Create снова вызывается на компоненте поддержки, которого я хочу избежать
Единственный способ обойти это - пометить bean-компонент как @Scope(ScopeType.SESSION), который поддерживает bean-компонент в течение всего сеанса входа пользователя в систему (как и ожидалось).
Но, прочитав несколько раз в документации по SEAM, что это плохая практика, использовать таким образом бины поддержки сессий с областью действия... у меня вопрос, как я могу помешать перезагрузке бина с диалоговой областью действия при каждой перезагрузке страницы... Я чувствую, что упускаю что-то фундаментальное из области разговора??! Может кто-нибудь просветить меня, пожалуйста
Я включил отредактированную версию данного компонента ниже...
@Stateful
@Scope(ScopeType.CONVERSATION)
@Name("sessionActions")
@Restrict("#{identity.isLoggedIn()}")
public class SessionActionsBean implements SessionActions, Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@Logger private Log log;
@RequestParameter private String sId;
@In Redirect redirect;
@In private MessagePoster messagePoster;
@In private Map<String, String> messages;
@Create
@Begin(join=true)
@Override
public void create(){
log.debug("bean is being created")
}
//--------------------------- Cleanup methods
@Remove
@BypassInterceptors
@Override
public void cleanUp(){}
}
1 ответ
Ваш бин воссоздается каждый раз, потому что когда вы возвращаетесь на эту страницу, у вас, вероятно, возникает новый разговор.
Если вам нужно сохранить разговор открытым, вы должны посмотреть на механизмы распространения разговора во время навигации.
Однако нет ничего плохого в том, чтобы бин каждый раз создавался заново, если этого требует логика. Если вы беспокоитесь о производительности, не делайте превентивных предположений о создании объектов до правильного профилирования.
Если твой @Create
а также @Remove
методы управляют ресурсами, которые имеют более широкую область действия, чем диалог, вы должны отделить ваш компонент в области диалога от другого компонента в рамках сеанса, управляющего этими ресурсами.
Это довольно абстрактное рассуждение, но я надеюсь, что оно может помочь.