整合了一个框架,搭建完毕,运行没问题,写了个登陆测试下,结果报空指针,debug一看 action中的service属性是null,可我看了好几遍配置文件也没看出来我哪没弄好,求大家帮我看看。
Action  java代码
   private LoginService loginService;//等待注入
    
public ActionForward toLogin(ActionMapping mapping,
ActionForm form, HttpServletRequest request,
HttpServletResponse response){
LoginForm loginForm =(LoginForm)form;
String name=loginForm.getName();
String password=loginForm.getPassword();
String ss=loginService.LoginIF(name,password);//loginService是空
if(ss.equals("登陆成功")){
return  mapping.findForward("login");
}else{
return null;
}
}
//get  set 略struts.xml
<struts-config> 
  <form-beans>
      <form-bean name="loginForm" type="com.scx.dbms.system.dto.LoginForm"></form-bean>
  </form-beans>
  <action-mappings>
   <action path="/login.do" name="loginForm" 
      scope="request" type="com.scx.dbms.system.action.LoginAction" parameter="toLogin">
   <forward name="login" path="/test/success.jsp"></forward>
   <forward name="error" path="/test/error.jsp"></forward>
   </action> 
  </action-mappings>
</struts-config>
Spring.xml
<!--用户DAO层类 开始-->
<bean id="baseDao" class="com.scx.dbms.base.BaseDAO">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="testLoginDAO" 
class="com.scx.dbms.system.dao.TestLoginDAO"
parent="baseDao">
</bean>

<!--service层-->
<bean id="loginService"
class="com.scx.dbms.system.service.LoginServiceImpl">
<property name="testLoginDAO" ref="testLoginDAO"></property>
</bean>

<!--action层-->
<bean name="/login.do"
class="com.scx.dbms.system.action.LoginAction">
<property name="loginService" ref="loginService"></property>
</bean>
dataSourse。。<bean id="dataSourse"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="com.mysql.jdbc.Driver">
</property>
<property name="url"
value="jdbc:mysql://192.168.12.133:3306/dbms">
</property>
<property name="username" value="root"></property>
<property name="password" value="123"></property>
</bean>
<!-- 配置事务处理 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<!--设置service层 事务处理的方法 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" />
<tx:method name="add*" />
<tx:method name="query*" />
<tx:method name="delete*" />
<tx:method name="update*" />
<tx:method name="load*" />
</tx:attributes>
</tx:advice> <aop:config>
<aop:pointcut id="DAOServicePointcut"
expression="execution(* com.scx.dbms.*.service.impl.*.*(..))" />
<aop:advisor advice-ref="txAdvice"
pointcut-ref="DAOServicePointcut" />
</aop:config>

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSourse" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/scx/dbms/pojo/Login.hbm.xml</value>
<!--<value>classpath*:**/com/scx/dbms/pojo/*.hbm.xml</value>  -->
</list>
</property>
</bean>

解决方案 »

  1.   

    看看console报错信息,再找错误
      

  2.   

    严重: Servlet.service() for servlet action threw exception
    java.lang.NullPointerException
    at com.scx.dbms.system.action.LoginAction.toLogin(LoginAction.java:38)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:269)
    at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:170)
    at org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)
    at org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67)
    at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
    at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
    at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
    at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
    at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
    at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Thread.java:595)
      

  3.   

    建议看下注入的整个过程,是否有代码漏写,逻辑错误,既然是loginService为空,肯定是注入没成功。
      

  4.   

    com.scx.dbms.system.service.LoginServiceImpl
    com.scx.dbms.system.service.LoginServiceImpl
    这两个class能贴出来吗?可能是ApplicationContext中配置问题,导致没有injection成功
      

  5.   

    现在是service注入是null,不进这个类,和他没关系,就是应该配置文件的问题,我是没看出来
      

  6.   

    是不是你的DAO 里面没有Set方法 并且new 了一个空的对象
      

  7.   

    我遇到过这样的为难题;
    可能是spring的包问题 ,你换成其他版本的,我用spring3.05就会是Nullponit
    还成3.02就好了
      

  8.   

    是不是 com.scx.dbms.system.dao.TestLoginDAO中定义的private LoginService loginService  ;没有 setter和getter方法啊 ?public void setLoginService(LoginService loginService){
       this.loginService = loginService ;
    }public LoginService getLoginService(){
      return loginService ;
    }
      

  9.   

    service里面的dao写get,set了吗?
      

  10.   

    在action中就出错了 ,和service和dao有什么关系,都还没走到哪一步呢,现在的问题是 String ss=loginService.LoginIF(name,password);//loginService是空  String注入是null。jar问题?  能具体点是哪个jar吗?我检查下!
      

  11.   

    <bean id="baseDao" class="com.scx.dbms.base.BaseDAO">
            <property name="sessionFactory" ref="sessionFactory"></property>
        </bean>
        <bean id="testLoginDAO" 
            class="com.scx.dbms.system.dao.TestLoginDAO"
            parent="baseDao">
        </bean>总感觉你这个baseDao 那有点问题,注意检查,
      

  12.   

    private LoginService loginService ;没有 setter和getter方法啊 ?public void setLoginService(LoginService loginService){
      this.loginService = loginService ;
    }public LoginService getLoginService(){
      return loginService ;
    }不就是这样么
      

  13.   

      private LoginService loginService;//等待注入
        
        public ActionForward toLogin(ActionMapping mapping,
                ActionForm form, HttpServletRequest request,
                HttpServletResponse response){
            LoginForm loginForm =(LoginForm)form;
            String name=loginForm.getName();
            String password=loginForm.getPassword();
            String ss=loginService.LoginIF(name,password);//loginService是空
            if(ss.equals("登陆成功")){
                return  mapping.findForward("login");
            }else{
                return null;
            }
        }
    //get  set 略
      

  14.   

    注入 无非就是 配置文件的名称 与 自己的property 相同与否.
    //get set  set方法肯定是自动生成的了. 不是自动生成的话 看看 setLoginService(..) 这么写的么?
    楼上说 jar包? Spring的jar包有问题? 还真不清楚... 跟Dao层 Action 层 没毛儿关系. 就是Spring配置文件 和 前面映射的关系... 在好好 debug 一下 看看.
      

  15.   

    呵呵,说说我发现的问题,第一点:LoginAction中loginService没有getter和setter方法没有,第二点:在struts-config.xml(你的标题中说的是struts1,那么配置文件的名称是我现在写的这个)中配置的时候type="com.scx.dbms.system.action.LoginAction"这个不应该有,而应该是class="spring配置文件中对应的bean的id"。如果你直接type="com.scx.dbms.system.action.LoginAction"这样写spring永远没有有机会给你注入,因为程序执行到这里,它就直接跳到action中执行了,而不需要经过spring。
      

  16.   

    我觉得20楼说的有一定的道理。
    如果你想要spring来注入bean,那你的action就应该托管给spring
    看你的配置文件,应该是没有将action交给spring托管。
    你应当将所有跳转到action的请求,先转入spring的代理类,由它托管,它会在进入你的action之前注入action所需要的service。
      

  17.   


    这个为什么是这么陪,配置spring插件应是这样
    type="org.springframework.web.struts.DelegatingActionProxy"
    试试看
      

  18.   

    好像木有把Struts2交给Spring管理
      

  19.   

    改成那样报错了~~
     Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name '/login.do' defined in ServletContext resource [/WEB-INF/classes/spring-login.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'loginService' of bean class [org.springframework.web.struts.DelegatingActionProxy]: Bean property 'loginService' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1279)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1010)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4135)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4630)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:546)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1041)
    at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:964)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:502)
    at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1277)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:321)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)
    at org.apache.catalina.core.StandardService.start(StandardService.java:519)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
    Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'loginService' of bean class [org.springframework.web.struts.DelegatingActionProxy]: Bean property 'loginService' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
    at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:801)
    at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:651)
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:78)
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:59)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1276)
    ... 40 more
      

  20.   

    改成那个启动就报错了
     Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name '/login.do' defined in ServletContext resource [/WEB-INF/classes/spring-login.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'loginService' of bean class [org.springframework.web.struts.DelegatingActionProxy]: Bean property 'loginService' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1279)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1010)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4135)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4630)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:546)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1041)
    at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:964)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:502)
    at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1277)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:321)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)
    at org.apache.catalina.core.StandardService.start(StandardService.java:519)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
    Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'loginService' of bean class [org.springframework.web.struts.DelegatingActionProxy]: Bean property 'loginService' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
    at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:801)
    at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:651)
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:78)
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:59)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1276)
    ... 40 more
      

  21.   

    Bean property 'loginService' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
    就是你的这个loginService的get、set方法有问题啊。。你自己看。还有,你这个Action要交给Spring托管,那就要从spring里面去得到这个Action的实例,而不是type=“com.……”自己的包。有两种配置方法,一种是插件,plug-in,还有一种是controlplug-in的配置方法,在struts-config.xml里面写下面代码:<plug-in
    className="org.springframework.web.struts.ContextLoaderPlugIn">
    <set-property property="contextConfigLocation"
    value="/WEB-INF/applicationContext.xml" />
    </plug-in>Action的type是这样子的。type="org.springframework.web.struts.DelegatingActionProxy"control的配置方法,
    <controller>
    <set-property property="processorClass" value="org.springframework.web.struts.DelegatingRequestProcessor"/>Action里面的type就可以省略不写
    </controller>
      

  22.   

    谢谢大家  我找到问题所在了,多谢yexiongMYBH、EverWHL和秋风!
      

  23.   

    我也碰到这个问题了,用的是struts2,整合Spring。tomcat启动时,我单步跟进到了BIZ层,明明注入了,可从页面再进action,注入的BIZ就为空了!