SessionAware不会注入会话对象

时间:2009-04-15 15:17:30

标签: spring session dependency-injection struts2 struts

再一次在这里我提出了一个关于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;
}

现在出现了问题,我在MenuAction上通过ApplicationContext.xml上的以下xml片段注入了一个MenuBean

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

menuAction声明如下:

public class MenuAction extends ActionSupport implements Preparable, SessionAware

通过这样做,我需要使用私有成员实现会话集 .... 私人地图会话; .... @覆盖 public void setSession(Map session){    this.session = 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通过setter填充Menu并返回SUCESS,否则它将返回INPUT,这将导致登录屏幕。

提前致谢。

1 个答案:

答案 0 :(得分:3)

在我们之后,我设法发现错误。这不是在程序中,而是在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>  

我现在能够正确使用会话。