springmvc 注入总是空指针异常

各位大牛,小弟又来请教问题了
tomcat7.0+ spring3.1.1 + hibernate3.6.0
程序跑起来了,但是输入url后,抛空指针异常,查了很多资料,都没找到解决办法,请教大神

exception

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
root cause

java.lang.NullPointerException
cc.fanbang.api.manager.DBManager.addUser(DBManager.java:142)
cc.fanbang.api.controller.TestController.handleDBManagerTestRequest(TestController.java:43)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:601)
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

数据库配置成功,运行之后所有表建立起来
这是applicationContext.xml
destroy-method="close" >








<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="mappingDirectoryLocations">
        <list>
            <value>WEB-INF/mappings</value> 
        </list>
    </property>
    <property name="hibernateProperties" >
        <value>
            hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
            hibernate.hbm2ddl.auto=update
            hibernate.show_sql=true
            hibernate.format_sql=true
            hibernate.cache.use_second_level_cache=true
            hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
        </value>
    </property>
</bean>

<bean id="userDaoHibernate" class="cc.fanbang.api.dao.impl.UserDaoHibernate">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

这是spring-servlet.xml

<bean id="dbManager" class="cc.fanbang.api.manager.DBManager" >  
    <property name="userDaoHibernate" ref="userDaoHibernate" />

<!--




-->

<bean id="viewResolver"
    class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass"
        value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
</bean>

这是web.xml

contextConfigLocation
/WEB-INF/applicationContext.xml


org.springframework.web.context.ContextLoaderListener


index.html
index.htm
index.jsp
default.html
default.htm
default.jsp

<servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>

    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

3个回答

忘了说明,userDaoHibernate注入失败,总是空指针 userDaoHibernate有setter方法吗?

jinnianshilongnian
jinnianshilongnian 只需要知道 所有spring管理的不能new 而是要问spring要 spring不管理的 可以new
大约 7 年之前 回复
wuwei35531
wuwei35531 dbManager作为服务层,它所拥有的dao实例我全部采用spring依赖注入。我的整个逻辑是,TestController作为入口,通过url进入它,调用oneMethod,获得dbManager实例后,注入dao,开始访问数据库,这不行?但是我的model,都是用new 创建,而不是spring。请问能详细解释下不? 谢谢!
大约 7 年之前 回复
jinnianshilongnian
jinnianshilongnian 必须通过spring注入依赖 你自己获取就不能享受spring依赖注入了
大约 7 年之前 回复
wuwei35531
wuwei35531 我的意思是,为什么不能在TestController中用getInstance()获得实例
大约 7 年之前 回复
jinnianshilongnian
jinnianshilongnian 如果用注解 需要<context:annotation-config/> 来开启注解注入支持
大约 7 年之前 回复
wuwei35531
wuwei35531 我是这么写的,有一个测试控制类 @Controller @RequestMapping("/test") TestController { @RequestMapping("dbmanager") oneMethod() { DBManager.getInstance().addUser(user); //用静态方法获得一个实例 } } 根据您的提示,我修改了,在bean id="testController"中添加了dbManager注入 同时在TestController中 @Autowired private DBManager dbManager; set, get 在方法中使用dbManager.addUser(user),注释掉getInstance() 确实可以,请问这是为什么? 如果我仍用getInstance(),且测试控制类中没有dbManager属性,仅仅在bean中添加dbManager注入,也不行。 难道我必须不能用getInstance()? 谢谢
大约 7 年之前 回复
jinnianshilongnian
jinnianshilongnian 这就奇怪了 <bean id="testController" class="cc.fanbang.api.controller.TestController"></bean> 此处好像没有注入dBManager 你是怎么获取的 难道直接new的?
大约 7 年之前 回复
wuwei35531
wuwei35531 都有,set get方法全部有,我不知道能否追踪xml加载情况,数据表全部建立,tomcat运行时也没报异常
大约 7 年之前 回复

想必你的DBManager.getInstance()这个方法肯定是采用单例模式创建的,那里面的DBManager的实例肯定是new出来的了,new出来的实例和你在xml中配置的Spring管理的实例:
[code="java"]

[/code]
不是一个实例,因而里面的sessionFactory属性Spring是不会自动为你注入的,所以肯定是会抛空指针异常的。

貌似 private static UserDaoHibernate userDaoHibernate;
这个对象是不是要写成静态的。。。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!