Spring注入的bean 为什么总是空

J2EE 码拜 10年前 (2015-04-02) 1207次浏览 0个评论
 

配置文件

<bean id="loginService" class="com.testPlatform.service.LoginService" scope="prototype">
	<property name="userDao" ref="userDaoImp"/>
</bean>

<bean id="loginAction" class="com.testPlatform.action.LoginAction">
	<property name="loginService" ref="loginService"/>
</bean>

代码片段

public class LoginAction {

	private LoginService loginService;

	private Integer rtxID;
	private String password;

	public String loginValidate()
	{
		User user = loginService.loginValidate(rtxID, password);
		if( null == user )
		{
			return "error";
		}

		HttpServletRequest request = ServletActionContext.getRequest();
		request.getSession().setAttribute("sessionuserinfo", user);

		return "success";
	}

	public LoginService getLoginService() {
		return loginService;
	}
	public void setLoginService(LoginService loginService) {
		System.out.println("LoginService setter---------------------------");
		this.loginService = loginService;
	}
}

每次页面发起请求 来到函数loginValidate()时,发现loginService的值为null不知道为什么
我在LoginService类的构造函数中 增加了日志打印,tomcat启动的时候,出现了相应的日志,说明LoginService的构造函数已经被执行了,但为什么页面发起请求的时候LoginAction 的成员loginService的值为null?

以下是截取的 tomcat启动日志
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@7c4f8358: defining beans [dataSource,sessionFactory,transactionManager,daoTemplate,userDaoImp,loginService,loginAction]; root of factory hierarchy

2015-3-20 14:22:31 org.springframework.orm.hibernate3.HibernateTransactionManager afterPropertiesSet
信息: Using DataSource [org.apache.commons.dbcp.BasicDataSource@7b3cb2c6] of Hibernate SessionFactory for HibernateTransactionManager
UserDaoImp construct—————————
LoginService construct—————————
setUserDao setter—————————
LoginService setter—————————

Spring注入的bean 为什么总是空
web.xml里面怎么配置的
Spring注入的bean 为什么总是空
引用 1 楼 u010559460 的回复:

web.xml里面怎么配置的

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
  </context-param>
  <listener>
    <listener-class>
  		org.springframework.web.context.ContextLoaderListener
  	</listener-class>
  </listener>
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  
  <welcome-file-list>
    <welcome-file>/resource/product/login.jsp</welcome-file>
  </welcome-file-list>
  
  <session-config>
    <session-timeout>60</session-timeout>
  </session-config>  
</web-app>
Spring注入的bean 为什么总是空
loginService为什么要配置成多例的,把scope=”prototype”去掉试试,单例和多例在初始化时间上可能不一致。
Spring注入的bean 为什么总是空
亲 你是在弄ssh项目把  首先你要确定你web 配置监听启动了你的spring 配置 
 
你配置的service bean  把这个去掉 scope=”prototype”  spring 创建的 service 是单利模式  struts创建的是非单利模式  
 你需要在你spring 管理的action bean 上加上 scope=”prototype” 
Spring注入的bean 为什么总是空
引用 4 楼 huangcan_liu 的回复:

亲 你是在弄ssh项目把  首先你要确定你web 配置监听启动了你的spring 配置 
 
你配置的service bean  把这个去掉 scope=”prototype”  spring 创建的 service 是单利模式  struts创建的是非单利模式  
 你需要在你spring 管理的action bean 上加上 scope=”prototype” 

我的 web.xml发出来啦 在3楼 已经使用监听启动了spring的配置
你的意思是让我把配置改成下面的吗,使用下面的配置 貌似还是不行啊

<bean id="loginService" class="com.testPlatform.service.LoginService" >
	<property name="userDao" ref="userDaoImp"/>
</bean>

<bean id="loginAction" class="com.testPlatform.action.LoginAction" scope="prototype">
	<property name="loginService" ref="loginService"/>
</bean>
Spring注入的bean 为什么总是空
引用 3 楼 huangan0301 的回复:

loginService为什么要配置成多例的,把scope=”prototype”去掉试试,单例和多例在初始化时间上可能不一致。

去掉了 也不行噢~

Spring注入的bean 为什么总是空
引用 5 楼 zzbutchernew 的回复:
Quote: 引用 4 楼 huangcan_liu 的回复:

亲 你是在弄ssh项目把  首先你要确定你web 配置监听启动了你的spring 配置 
 
你配置的service bean  把这个去掉 scope=”prototype”  spring 创建的 service 是单利模式  struts创建的是非单利模式  
 你需要在你spring 管理的action bean 上加上 scope=”prototype” 

我的 web.xml发出来啦 在3楼 已经使用监听启动了spring的配置
你的意思是让我把配置改成下面的吗,使用下面的配置 貌似还是不行啊

<bean id="loginService" class="com.testPlatform.service.LoginService" >
	<property name="userDao" ref="userDaoImp"/>
</bean>

<bean id="loginAction" class="com.testPlatform.action.LoginAction" scope="prototype">
	<property name="loginService" ref="loginService"/>
</bean>

是的  你修改成这样还有问题吗?

Spring注入的bean 为什么总是空
引用 5 楼 zzbutchernew 的回复:
Quote: 引用 4 楼 huangcan_liu 的回复:

亲 你是在弄ssh项目把  首先你要确定你web 配置监听启动了你的spring 配置 
 
你配置的service bean  把这个去掉 scope=”prototype”  spring 创建的 service 是单利模式  struts创建的是非单利模式  
 你需要在你spring 管理的action bean 上加上 scope=”prototype” 

我的 web.xml发出来啦 在3楼 已经使用监听启动了spring的配置
你的意思是让我把配置改成下面的吗,使用下面的配置 貌似还是不行啊

<bean id="loginService" class="com.testPlatform.service.LoginService" >
	<property name="userDao" ref="userDaoImp"/>
</bean>

<bean id="loginAction" class="com.testPlatform.action.LoginAction" scope="prototype">
	<property name="loginService" ref="loginService"/>
</bean>

你这样修改配置还是不行 那你确定你的struts 配置应用了你spring配置的action?
<action id=””xxx”” class=””xxx””><action> 报什么样的错误 可否贴出错误

Spring注入的bean 为什么总是空
把getter方法去掉试试
Spring注入的bean 为什么总是空
把struts配置给出来……..
Spring注入的bean 为什么总是空
引用 10 楼 linuxpingwangping 的回复:

把struts配置给出来……..

struts配置:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
    "http://struts.apache.org/dtds/struts-2.1.7.dtd">

<struts>
	<constant name = "struts.i18n.encoding" value="UTF-8"/>

	<package name ="login" extends="struts-default">       
		<action name="login" class="com.testPlatform.action.LoginAction" method="loginValidate">
			<result name="error">/resource/login.jsp</result>
			<result name="success">/resource/main.jsp</result>
		</action>
	</package>
</struts>
Spring注入的bean 为什么总是空
引用 8 楼 huangcan_liu 的回复:
Quote: 引用 5 楼 zzbutchernew 的回复:
Quote: 引用 4 楼 huangcan_liu 的回复:

亲 你是在弄ssh项目把  首先你要确定你web 配置监听启动了你的spring 配置 
 
你配置的service bean  把这个去掉 scope=”prototype”  spring 创建的 service 是单利模式  struts创建的是非单利模式  
 你需要在你spring 管理的action bean 上加上 scope=”prototype” 

我的 web.xml发出来啦 在3楼 已经使用监听启动了spring的配置
你的意思是让我把配置改成下面的吗,使用下面的配置 貌似还是不行啊

<bean id="loginService" class="com.testPlatform.service.LoginService" >
	<property name="userDao" ref="userDaoImp"/>
</bean>

<bean id="loginAction" class="com.testPlatform.action.LoginAction" scope="prototype">
	<property name="loginService" ref="loginService"/>
</bean>

你这样修改配置还是不行 那你确定你的struts 配置应用了你spring配置的action?
<action id=””xxx”” class=””xxx””><action> 报什么样的错误 可否贴出错误

就是空指针
java.lang.NullPointerException
com.testPlatform.action.LoginAction.loginValidate(LoginAction.java:19)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:452)
com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:291)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:254)
com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:263)
org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:133)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:190)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:243)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:142)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:166)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:176)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:190)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:485)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395)

Spring注入的bean 为什么总是空
建议楼主看一下这篇文章[http://blog.csdn.net/camper001/article/details/6121910
Spring注入的bean 为什么总是空
第一  action中  loginService不应该有get方法
第二  配置文件中 你配置数据源了吗
<property name=”dataSource”>
     <ref bean=”dataSource”/>
  </property>
Spring注入的bean 为什么总是空
Struts 配置文件有问题:

<struts>
    <constant name = "struts.i18n.encoding" value="UTF-8"/>
         
    <package name ="login" extends="struts-default">       
        <action name="login" class="com.testPlatform.action.LoginAction" method="loginValidate">
            <result name="error">/resource/login.jsp</result>
            <result name="success">/resource/main.jsp</result>
        </action>
    </package>
</struts>

com.testPlatform.action.LoginAction   改成 你 spring 里配置的 loginAction

<bean id="loginAction" class="com.testPlatform.action.LoginAction" scope="prototype">
    <property name="loginService" ref="loginService"/>
</bean>
Spring注入的bean 为什么总是空
40分
引用 12 楼 zzbutchernew 的回复:
Quote: 引用 8 楼 huangcan_liu 的回复:
Quote: 引用 5 楼 zzbutchernew 的回复:
Quote: 引用 4 楼 huangcan_liu 的回复:

亲 你是在弄ssh项目把  首先你要确定你web 配置监听启动了你的spring 配置 
 
你配置的service bean  把这个去掉 scope=”prototype”  spring 创建的 service 是单利模式  struts创建的是非单利模式  
 你需要在你spring 管理的action bean 上加上 scope=”prototype” 

我的 web.xml发出来啦 在3楼 已经使用监听启动了spring的配置
你的意思是让我把配置改成下面的吗,使用下面的配置 貌似还是不行啊

<bean id="loginService" class="com.testPlatform.service.LoginService" >
	<property name="userDao" ref="userDaoImp"/>
</bean>

<bean id="loginAction" class="com.testPlatform.action.LoginAction" scope="prototype">
	<property name="loginService" ref="loginService"/>
</bean>

你这样修改配置还是不行 那你确定你的struts 配置应用了你spring配置的action?
<action id=””xxx”” class=””xxx””><action> 报什么样的错误 可否贴出错误

就是空指针
java.lang.NullPointerException
com.testPlatform.action.LoginAction.loginValidate(LoginAction.java:19)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:452)
com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:291)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:254)
com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:263)
org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:133)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:190)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:243)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:142)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:166)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:176)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:190)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:485)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395)

   struts 的action 配置 把class 换成 spring 配置的action 对应的id
????<action?name=”login”?class=”com.testPlatform.action.LoginAction”?method=”loginValidate”>
????????????<result?name=”error”>/resource/login.jsp</result>
????????????<result?name=”success”>/resource/main.jsp</result>
????????</action>

修改后
????<action?name=”login”?class=”loginAction” >
????????????<result?name=”error”>/resource/login.jsp</result>
????????????<result?name=”success”>/resource/main.jsp</result>
????????</action>

你使用spring 来管理的你的action  所以对象有spring 帮助创建 直接引用spring 配置好的对象id即可

Spring注入的bean 为什么总是空
http://goobbe.com/question/20002779/java-how-to-delegate-struts2-action-s-instantiation-to-spring-using
Spring注入的bean 为什么总是空
spring的配置得加个default-autowire=”byName”吧。
Spring注入的bean 为什么总是空
同意16楼,你既然要spring管理的bean,你应该在struts里面配置上
Spring注入的bean 为什么总是空
struts配置错误,要使用Spring里面配置的Struts id 才行
Spring注入的bean 为什么总是空
这个问题终于搞定。

1.将LoginAction的作用域 设置为prototype
2.修改struts.xml , login action的class 属性要使用spring中LoginAction的ID
3.工程中必须要有struts2-spring-plugin-xx.jar 否则tomcat启动时,会报错 找不到action对应的类

感谢所有人的回答。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Spring注入的bean 为什么总是空
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!