做一个简单的IOC注入:但就是注不进去,dataSource,userManager都报空指针(applicationContext.xml读入内存没有问题),具体代码如下:
页面中用一个连接访问到servlet,如下:
其中已经配置了dataSource和userManager的set方法public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
dataSource.getConnection();
} catch (SQLException e) {}
userManager.addUser(null);
}applicationContext.xml<!-- 配置连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost/assignment</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>root</value>
</property>
</bean>

<!-- Servlet中配置UserManager -->
<bean id="userManager" class="com.dao.impl.UserManagerImpl" />

<bean name="/addUserServlet" class="com.servlet.addUserServlet">
<property name="dataSource" ref="dataSource"></property>
<property name="userManager" ref="userManager"></property>
</bean>web.xml中:<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>
望高手们给看看。急~~~~~~~~~谢谢

解决方案 »

  1.   

    抛出的异常都是基本的空指针异常啊2009-10-22 23:09:35 org.apache.catalina.core.StandardWrapperValve invoke
    严重: Servlet.service() for servlet addUserServlet threw exception
    java.lang.NullPointerException
    at com.servlet.addUserServlet.doPost(addUserServlet.java:53)
    at com.servlet.addUserServlet.doGet(addUserServlet.java:43)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    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.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:128)
    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:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
    at java.lang.Thread.run(Thread.java:619)
      

  2.   

    呵呵, 配置问题。    <!-- Servlet中配置UserManager -->
        <bean id="userManager" class="com.dao.impl.UserManagerImpl" />
        
        <bean name="/addUserServlet" class="com.servlet.addUserServlet">
            <property name="dataSource" ref="dataSource"></property>
            <property name="userManager" ref="userManager"></property>
        </bean>
    ===============================================
    addUserServlet是在web.xml配置的, 一个请求过来, 是由JSP容器初始化了这个servlet, 所以执行的servlet跟spring配置的那个servlet没点关系, 自然就空指针了呵呵。
      

  3.   

    我确实在web.xml和applicationContext.xml中都配置了servlet
    那应该怎样修改呢?望指教!!谢谢
      

  4.   

    貌似应该在web.xml里面加上
    <servlet>
    <servlet-name>addUserServlet</servlet-name>
    <servlet-class>
    com.servlet.addUserServlet
    </servlet-class>
    ...
    </servlet> <servlet-mapping>
    ...
    </servlet-mapping>
    这些信息吧。
    我是刚学java的,根据7楼的回答理解的,不知道答的对不对,继续学习ing
      

  5.   

    <bean name="/addUserServlet" class="com.servlet.addUserServlet">
            <property name="dataSource" ref="dataSource"></property>
            <property name="userManager" ref="userManager"></property>
        </bean>
    name="/addUserServlet"把这个换为userManagerNew,然后在Servet里面private UserManager userManagerNew生成set,get方法
      

  6.   

    建议把UserManager这个类贴出来。
      

  7.   

    不好意思,刚才说错了,没必要贴出UserManager,你的配置有问题,struts-config.xml能看一下吗?
      

  8.   

    楼主,你的dataSource和userManager根本就没有注入进来,所以在调用
    dataSource.getConnection()和userManager.addUser()就报空指针异常。在servlet中输出一下System.out.println(userManagerImpl)值是null    
      

  9.   


    我又研究了一下,不是没有注入进来,而是根本就没有调用这个bean
    <bean name="/addUserServlet" class="com.servlet.addUserServlet">
            <property name="dataSource" ref="dataSource"></property>
            <property name="userManager" ref="userManager"></property>
        </bean>
    如下调用代码:
    ApplicationContext ctx = new ClassPathXmlApplicationContex("applicationContext.xml");
      .... ctx.getBean("XXX");
      

  10.   

    建议写个Manger.java类,代替servlet,该类中含两个属性dataSource和userManager,并处理业务逻辑,将该类注入spring容器,在servlet中调用
    ApplicationContext ctx = new ClassPathXmlApplicationContex("applicationContext.xml"); IManager manager = (IManager) ctx.getBean("add");
      

  11.   


    <!-- 配置连接池 -->
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
            <property name="driverClassName">
                <value>com.mysql.jdbc.Driver</value>
            </property>
            <property name="url">
                <value>jdbc:mysql://localhost/assignment</value>
            </property>
            <property name="username">
                <value>root</value>
            </property>
            <property name="password">
                <value>root</value>
            </property>
        </bean>
        
        <!-- Servlet中配置UserManager -->
        <bean id="userManager" class="com.dao.impl.UserManagerImpl">
            <property name="dataSource" ref="dataSource"></property>
         </bean>
        <!-- 楼主这样注入daSource才有效!!-->
        <bean name="/addUserServlet" class="com.servlet.addUserServlet">
            <property name="userManager" ref="userManager"></property>
        </bean>
      

  12.   


    我已经在web.xml中将Spring的配置文件load到内存中了,当我访问/addUserServlet的时候应该会为我注入相关类啊。大伙再帮着想想,我都快疯了呀。。
      

  13.   


    你引用是引用web.xml的servlet的<url-pattern>。 你是将servlet注入到了spring,但是没用调用servlet的类,怎么行。只有struts中的action才能由spring托管,且不用调用
    ApplicationContext ctx = new ClassPathXmlApplicationConte("applicationContext.xml"); 
      .... ctx.getBean("XXX"); 
      

  14.   

    也就是说将servlet注入到spring中,必须要显示的调用才行,而不可以像struts那样自动的注入是吧
      

  15.   


    我是这个意思  不知道有没有办法能像struts那样由spring来生成代理 但是这个肯定不行
      

  16.   

    servlet是不能像其他类那样注入的,servlet注入是另外一种,要用代理的,所以你那样注入会直接报错的,初始化时会加载,但运行时就报错了,你得换方法,好像是WebApplicationContext代理