当前位置: 代码迷 >> J2EE >> Spring注入的bean 老是空是为什么
  详细解决方案

Spring注入的bean 老是空是为什么

热度:73   发布时间:2016-04-17 23:16:39.0
Spring注入的bean 总是空是为什么
配置文件
<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---------------------------
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

亲 你是在弄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即可

  相关解决方案