Сеанс 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 методы управляют ресурсами, которые имеют более широкую область действия, чем диалог, вы должны отделить ваш компонент в области диалога от другого компонента в рамках сеанса, управляющего этими ресурсами.

Это довольно абстрактное рассуждение, но я надеюсь, что оно может помочь.

Другие вопросы по тегам