整合了一个框架,搭建完毕,运行没问题,写了个登陆测试下,结果报空指针,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>
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>
解决方案 »
- eclipse下面有一个servers 与菜单里的启动tomcat有什么区别
- 求window下bugzilla批处理安装方法(数据库可以自己安装)
- session.clear(); 有没有必要写
- struts2 <s:optiontransferselect>有下拉的滚动条,但是没有左右滚动条,请问怎么加?
- Manager访问认证出错
- 关于角色模块权限控制时的radio处理问题
- preparedStatement 插入问题 急 急 急!!!
- **(在线等)两个页面传值的问题???
- 请问如何实现“单用户”登陆问题--即多个用户不能同时使用同一帐号在线
- html页面经过Filter过滤器后部分中文乱码
- 那些ip数据库中的ip对应的经纬度怎么得到的?
- java编写此程序
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)
com.scx.dbms.system.service.LoginServiceImpl
这两个class能贴出来吗?可能是ApplicationContext中配置问题,导致没有injection成功
可能是spring的包问题 ,你换成其他版本的,我用spring3.05就会是Nullponit
还成3.02就好了
this.loginService = loginService ;
}public LoginService getLoginService(){
return loginService ;
}
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="testLoginDAO"
class="com.scx.dbms.system.dao.TestLoginDAO"
parent="baseDao">
</bean>总感觉你这个baseDao 那有点问题,注意检查,
this.loginService = loginService ;
}public LoginService getLoginService(){
return 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 略
//get set set方法肯定是自动生成的了. 不是自动生成的话 看看 setLoginService(..) 这么写的么?
楼上说 jar包? Spring的jar包有问题? 还真不清楚... 跟Dao层 Action 层 没毛儿关系. 就是Spring配置文件 和 前面映射的关系... 在好好 debug 一下 看看.
如果你想要spring来注入bean,那你的action就应该托管给spring
看你的配置文件,应该是没有将action交给spring托管。
你应当将所有跳转到action的请求,先转入spring的代理类,由它托管,它会在进入你的action之前注入action所需要的service。
这个为什么是这么陪,配置spring插件应是这样
type="org.springframework.web.struts.DelegatingActionProxy"
试试看
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
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
就是你的这个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>