SessionAware не внедряет объект сеанса - PullRequest
2 голосов
/ 15 апреля 2009

Еще раз я пришел с вопросом о s2, я новичок в этом и получил некоторые проблемы с поиском примеров.

Я создаю сервис меню, который зависит от логина, который выдается при входе пользователя на стартовую страницу. После входа в систему я сохраняю объект пользователя в сеансе, выполняя следующие действия:

@Override
public String intercept(ActionInvocation invocation) throws Exception {
....

// verifica se o parametro do CPF veio no get e tenta logar o usuario
if (!StringUtils.isBlank(request.getParameter(USER_CPF_REQUEST))) {

if ( doLogin(request, session) ) {
   return Action.SUCCESS;
}

, а затем метод doLogin

Usuario usuario = getServico().buscar( Long.valueOf(cpf) );
//Caso o usuário exista, guarda na session
if (usuario != null){
    session.setAttribute(USER_HANDLE, usuario);
    return true;
}

Теперь возникает проблема, у меня есть MenuBean, введенный в MenuAction следующей XML-частью в ApplicationContext.xml

<bean id="menuAction" scope="prototype" class="br.com.autenticis.renacon.actions.MenuAction">
    <constructor-arg ref="menuService" />
</bean>

И действие меню объявлено следующим образом:

public class MenuAction extends ActionSupport implements Preparable, SessionAware

Для этого мне нужно реализовать набор сеансов с закрытым членом .... приватная карта сеанса; .... @Override public void setSession (Map session) { this.session = сессия; } Неудачная часть всего этого метода ниже, объект сеанса является нулевым при отладке:

public String execute() {
        if ( session.containsKey( LoginInterceptor.USER_HANDLE) ){
            Usuario u = (Usuario) session.get( LoginInterceptor.USER_HANDLE);
            setMenu( servico.getMenuPerfil( u.getPerfil() ) );
            return Action.SUCCESS;
        }

        return input();
    }

Кто-нибудь знает почему? или как это реализовать? Глядя на код выше, мне нужно «Perfil» от пользователя, который вошел в систему, если сеанс содержит ключ к пользовательскому объекту, я его получаю, а затем использую perfil, чтобы заполнить меню через установщик и вернуть SUCESS, иначе Я верну INPUT, который приведет к экрану входа в систему.

Заранее спасибо.

1 Ответ

3 голосов
/ 16 апреля 2009

После некоторого нашего мне удалось обнаружить ошибку. который лежит не в программе, а в struts.xml, я написал собственный стек для приложения:

<!-- stack seguro --> 
<!-- 
<interceptor-stack name="defaultLoginStack"> 
<interceptor-ref name="logger" /> 
<interceptor-ref name="params" /> 
<interceptor-ref name="login" /> 
<interceptor-ref name="prepare" /> 
<interceptor-ref name="chain" /> 
<interceptor-ref name="modelDriven" /> 
<interceptor-ref name="modelDriven" /> 
<interceptor-ref name="fileUpload" /> 
<interceptor-ref name="staticParams" /> 
<interceptor-ref name="params" /> 
<interceptor-ref name="conversionError" /> 
<interceptor-ref name="validation" /> 
<interceptor-ref name="workflow" /> 
</interceptor-stack> 
--> 

И несколько забыл включить элементы, связанные с сеансом, с defaultLoginStack, измененным на

<interceptor-stack name="defaultLoginStack"> 
<interceptor-ref name="login" /> 
<interceptor-ref name="defaultStack" /> 
</interceptor-stack>  

Теперь я могу использовать введенный сеанс правильно.

...