feixiang76
2009-11-04 22:59
浏览 246
已采纳

struts2+spring整合后Action实现SessionAware后获取不到Session

以下是Action实现的方法,下面只是贴出了Action的实现,代码测试过没问题,但只要运行到设置Session的地方就通不过,但也不报错,通过检测发现设置session时通过IOC方式注入的map形式的session未获取到,也就是getSession得到的是null,所以程序执行不了,看看哪位能看出下面程序问题的指点一下,我找了两天了,对照struts2中的示例也没发现哪里有问题,在此先谢谢了!

public class ManagerAction extends ActionSupport implements SessionAware{
IGxManagerService gxManagerService=null; 

 private String username = null;

private String password = null;

private Map session;

public void setSession(Map value) {//实现SessionAware中的setSession方法,通过IOC方式注入Session
session = value;
}

public Map getSession() { //获取map形式的session集合
return session;
}

         public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}
public GxManager getManagerSessionInfo() {
return (GxManager) getSession().get(WebConstants.WEB_MANAGER_KEY);
}

/**
* <p>
* Store new reference to GxManager Object.
* </p>
*
* @param GxManager
*            GxManager object for authenticated GxManager
*/
public void setManagerSessionInfo(GxManager gxManger) {
getSession().put(WebConstants.WEB_MANAGER_KEY, gxManger);
}
public IGxManagerService getGxManagerService() {
return gxManagerService;
}

public void setGxManagerService(IGxManagerService gxManagerService) {
this.gxManagerService = gxManagerService;
}

public String login() {
GxManager gxManager = null;
try {
gxManager = gxManagerService.checkLogin(getUsername(),getPassword());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (gxManager != null) {
setManagerSessionInfo(gxManager); //此处出现问题,检测的结果是调用上面蓝色的getSession时获取到的值为NULL
}
if (hasErrors()) {
                      return INPUT;
                   }
return SUCCESS;
}

}

 


问题补充:
配置文件都应该是没问题的,因为只要我把setManagerSessionInfo(gxManager)这一句注释掉程序就可以正常执行的
问题补充:
下面这个是spring的配置文件
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver">
</property>
<property name="url" value="jdbc:mysql://localhost:3306/test"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</bean>

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<prop key="hibernate.show_sql">false</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/gx/entity/member/GxUserinfo.hbm.xml</value>
<value>com/gx/entity/GxManager.hbm.xml</value></list>
</property>
</bean>
<bean id="myTransactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>

<bean id="transationInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="myTransactionManager" />
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="Save*">PROPAGATION_REQUIRED</prop>
<prop key="merge*">PROPAGATION_REQUIRED</prop>
<prop key="shield*">PROPAGATION_REQUIRED</prop>
</props>
</property>

</bean>

<bean
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<value>*DAO,*Service,*Services</value>
</property>
<property name="interceptorNames">
<list>
<value>transationInterceptor</value>
</list>
</property>
</bean>
   
<bean id="GxManagerDAO" class="com.gx.dao.imp.GxManagerDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<bean id="GxManagerService" class="com.gx.service.imp.GxManagerService">
    <property name="gxManagerDAO">
<ref bean="GxManagerDAO" />
</property>
</bean>
<bean id="ManagerAction" class="com.gx.web.action.ManagerAction">
    <property name="gxManagerService">
<ref bean="GxManagerService" />
</property>
</bean>
</beans>
问题补充:
public class ManagerAction extends ActionSupport implements SessionAware
方法中已经实现了SessionAware接口,session应该是由struts2中的IOC方式自动注入的,应该不需要通过spring进行注入才是的!
问题补充:
那应该怎么注入呢,因为如果只单独使用struts2上面的方式是可以获取到session的,因为上面是struts2中所说的通过实现sessionAware以IOC的方式获取struts2中封闭的map形式的底层session集合,上面之所以得不到,应该是由于struts2整合了spring的原因,但具体在spring中如何注入就不知道怎么做了!
  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

9条回答 默认 最新

  • CaiHuajiang 2009-11-05 10:56
    已采纳

    怀疑你覆盖了struts中的拦截器设置,使得session拦截器失效。
    能不能帖出struts.xml代码

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • CaiHuajiang 2009-11-04 23:29

    [code="java"]public GxManager getManagerSessionInfo() {
    return (GxManager) getSession().get(WebConstants.WEB_MANAGER_KEY);
    } [/code]
    怎么感觉有点别扭,一个model的属性注入另一个属性。可以?

    评论
    解决 无用
    打赏 举报
  • weixin_42519046 2009-11-05 08:43

    SPRING配置文件发来看看

    评论
    解决 无用
    打赏 举报
  • weixin_42519046 2009-11-05 09:10

    你自己测试一下 调一下getSession()方法,看看session有值吗
    没有值 就是SPRING配置文件注入错误,setManagerSessionInfo(gxManager); 这个代码你注释,就不会调用getSession方法了,就算SPRING注入错误,当然也不会报错了,所以还是把配置文件发来看看吧

    评论
    解决 无用
    打赏 举报
  • weixin_42519046 2009-11-05 10:11

    你配置文件里根本就没有 注入session啊 ,当然是NULL了





    你看你这个action里 哪有session的注入?

    评论
    解决 无用
    打赏 举报
  • weixin_42519046 2009-11-05 10:33

    不是的,需要自己注入
    private Map session; 你这里声明的 session找谁去? set get方法都没有super() 那里实现了SessionAware接口?
    再说你注入的是GxManagerService类 也不是SessionAware接口啊
    另外,struts应该是web层吧,spring才是业务逻辑层吧,是spring来控制反转的吧?两个业务逻辑层?struts怎么将object注入到spring里?

    评论
    解决 无用
    打赏 举报
  • CaiHuajiang 2009-11-05 10:46

    [quote]你配置文件里根本就没有 注入session啊 ,当然是NULL了





    你看你这个action里 哪有session的注入?[/quote]

    楼上的说法是错误的,只要继承了sessionaware接口的的会自动注入struts session。

    评论
    解决 无用
    打赏 举报
  • CaiHuajiang 2009-11-05 10:51

    将private Map session;
    这句话改为private Map session = new HashMap();

    试试

    评论
    解决 无用
    打赏 举报
  • CaiHuajiang 2009-11-05 10:53

    还真找不出来

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题