Spring自动装配中的NullpointerException,即使bean定义是在dispatcher-servlet.xml中编写的

时间:2015-05-20 11:23:39

标签: java spring dependency-injection javabeans autowired

我读到了关于自动装配概念并试图在我的项目中使用它。我想要的只是为特定类创建一个实例,并且可以与所有具有自动装配的类一起使用。

我在 dispatcher-servlet.xml

中定义了一个bean
<bean id="modifyService"
  class="com.xyz.service.ModifyPreferencesService"/>

没有定义范围,因此它将是单例。 现在我在两个班级中使用它。

class ABCEvaluationService{
@Autowired
ArrayList listIncident;
//This class is instantiating IncidentFactory with new keyword in a method
**//Methods using listIncident - getting empty list here**
}

class IncidentFactory{
**@Autowired
List listIncident
@Autowired
ModifyPreferencesService modifyService;**

//This class creates Incident Objects and add it to the listIncident.
**//Uses modifyService class objects - but I am getting null here**
}

问题是我能够在头等舱中使用它但在第二个类中它给了我NullPointerException。 同样的事情发生在其他bean上。我在做什么这个错了。这不是自动装配的目的吗?请解释..我正在学习春天,并且不想学习错误的概念。

完整的dispatcher-servlet.xml是(我真的不能复制粘贴..所以可能会出现语法错误。如果有的话请忽略):

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.1.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
    <context:component-scan base-package="mypack" />        
  <mvc:annotation-driven/>
  <mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/ABCReportForm"/>
        <bean class="com.xyz.interceptor.ValueStreamInterceptor" />
    </mvc:interceptor>
  </mvc:interceptors>
  <mvc:default-servlet-handler/>

  <mvc:resources location="/resources/" mapping="/resources/**"/>

  <bean id="validator"
  class="com.xyz.validator.ABCValidator"/>
  <bean id="modifyService"
  class="com.xyz.service.ModifyPreferencesService"/>

  <bean id="abcService"
  class="com.xyz.service.ABCEvaluationService"/>
  <bean id="listIncident"
  class="java.utilArrayList"/>

  //Code for InternalResourceViewer
  </beans>

由于

1 个答案:

答案 0 :(得分:0)

Spring对集合对象进行了古怪的处理。它假定您要求许多bean都实现一些通用接口。自动装配集合需要使用其名称。

此外: - 使用泛型。 - 使用Spring Boot而不是手动配置(使用过时的版本)。 - 使用构造函数注入而不是字段注入来使代码更易于测试和维护。