spring整合struts2时action的service注入不进来,报空指针异常,纠结了很久,求大神帮忙,解决了加分。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring整合struts2时action的service注入不进来,报空指针异常,纠结了很久,求大神帮忙,解决了加分。相关的知识,希望对你有一定的参考价值。

异常如图:

struts.xml文件:
<struts> <constant name="struts.objectFactory" value="spring"></constant> <constant name="struts.i18n.encoding" value="utf-8"></constant>
<package name="firstPackage" extends="struts-default"> <!-- 此处的action应该和applicationContext.xml中配置的action保持一致 --> <action name="login" class="loginAction" method="execute"> <result name="SUCCESS">/WEB-INF/jsp/homepage.jsp</result> <result name="ERROR"> /WEB-INF/jsp/login.jsp </result> </action> </package>
</struts>

applicationContext.xml文件:

<!-- 省略datasource和sessionFactory配置 --> <!-- 第一步,配置DAO支持类,引入HibernateTemplate --> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate" scope="prototype"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <bean id="blogLoginInfoDao" class="com.ssh.dao.BlogLoginInfoDao" scope="prototype"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 第二步,配置service --> <bean id="loginInfoService" class="com.ssh.service.impl.BlogLoginInfoServiceImpl" scope="prototype"> <property name="blogLoginInfoDao" ref="blogLoginInfoDao"></property> </bean> <!-- 第三步,配置action --> <bean id="loginAction" class="com.ssh.action.LoginAction" scope="prototype"> <property name="blogLoginInfoService" ref="loginInfoService"></property> </bean>
LoginAction.java主要代码如下:

jsp页面提交时能正确接收到userName和passWord参数,但执行到第19行时前台就报空指针异常,其它配置应该都没问题。

写个 Main 方法测试一下,看你的配置文件好像没有问题,但为空的话,应该在启动的时候就报错了

用 main 方法测一下,getBean("loginInfoService"); 看有没有值。
如果有,再 getBean("loginAction") ,然后看里面的属性有没有值。追问

服务器启动的时候没有报错啊

追答

那你有没有写个main 方法,把两个 bean 拿出来,看是否有空的??

追问

 

这两个bean都不为空啊

追答

你只是证明了 loginAction 不为空,你调用 一下 他的 getXXXX 方法,看你注入的 那个 service 是否为空,如果不为空,那就不应该出问题。

追问

context.getBean("loginAction") 得到loginAction后怎么调用它的getBlogLoginInfoService()方法,直接.getBlogLoginInfoService()不行。context.getBean("loginAction") .getClass().getBlogLoginInfoService()也不行。

追答

晕,直接强转呀。
LoginAction action = (LoginAction) context.getBean("loginAction") ;

System.out.println(action.getBlogLoginInfoService());

参考技术A 第19 行出现空指针
且19行返回的类型 为boolean类型。只有true和false
这就说明了前台传过来的 用户名 和 密码 有一个 为null或2个都为 null,看看 用户名和密码
为什么为null

追问

不是用户名和密码的问题,用户名和密码都正确,debug追踪到是注入的blogLoginInfoService为null

参考技术B action层19行代码报错,报空指针,你19行的代码应该是这种形式的【servive.具体实现类(参数)】,应该就是这个参数没有值,不信你debug下~~追问

debug时,参数userName,passWord都有值,都能正确接收,blogLoginInfoService为null,没有注入成功。

追答

那你检查下Spring的配置文件,blogLoginInfoService这个get,set没有?

追问

我已经把主要代码都贴出来了,action里面blogLoginInfoService的get ,set方法都有

参考技术C service封装了么?追问

已经封装了,只要执行到blogLoginInfoService时就报异常,根本没进入到下面的代码。

追答

你debug一下, 看看userName和passWord中是否有值。

追问

都能正确接收参数值

参考技术D 你将配置action那个配置的作用域 改为 request试试追问

试了下,还是不行,一样的空指针异常

第5个回答  2013-09-23 把你的报错信息贴出来追问

看题目啊,早就贴出来了

Spring与Struts整合

一 概述

1.整合目的

有了Spring以后,所有对象的创建任务都应该交给Spring容器来完成,这样做不仅是为了降低代码的耦合度,而且可以利用Spring容器作为代理工厂实现代理。

2.整合目标

将Spring容器中的bean注入Action中,将Action的创建与管理工作交给Spring容器。

二 实现

1.基础

Spring与Struts的整合建立在Spring与Web整合的基础之上。

2.整合架包

Struts2提供了与Spring兼容的架包struts2-spring-plugin.jar,整合需要导入该架包。

3.Spring创建Action

完成了Spring与Web的整合以后,Spring容器会根据名称将bean注入到action中,这一步完成了将Spring容器中的bean
注入到action中的任务,将action创建与管理工作交给Spring容器的任务还没有完成,在Spring配置文件的编写:

<bean id="springActionName"class="xxxxAction"scope="prototype">
     <property name="" ref="">//注入action中引用的 bean
</bean>

action是多例的,必须将作用域设为prototype.

4.Struts引用

<package name=""extends="struts-default"namespace="">
   <action name="myAction"class="springActionName">
      xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
   </action>
</package>

在Struts.xml中通过id引用在Spring容器中创建的Action对象。


以上是关于spring整合struts2时action的service注入不进来,报空指针异常,纠结了很久,求大神帮忙,解决了加分。的主要内容,如果未能解决你的问题,请参考以下文章

struts2 与spring整合

Struts2Struts2与Spring整合后,如何指定Action为多例模式

Spring和Struts2整合

spring整合struts2时action的service注入不进来,报空指针异常,纠结了很久,求大神帮忙,解决了加分。

Spring框架+Struts2框架第一次整合

ssh整合