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

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代码

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(8条)

报告相同问题?

悬赏问题

  • ¥15 python天天向上类似问题,但没有清零
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)