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 方法测一下,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());
且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注入不进来,报空指针异常,纠结了很久,求大神帮忙,解决了加分。的主要内容,如果未能解决你的问题,请参考以下文章
Struts2Struts2与Spring整合后,如何指定Action为多例模式
spring整合struts2时action的service注入不进来,报空指针异常,纠结了很久,求大神帮忙,解决了加分。