简体   繁体   中英

Spring @Autowired field returns null

I am trying to run on Tomcat a Spring 3 + Struts 2 + Hibernate web app, but it fails to start with NullPointerException for autowired field. I have checked other similar questions but couldn't solve my problem. I am new to Spring and Struts.

mvc-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/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
                    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">

    <context:component-scan base-package="com.se.pl.prm.controller" />

    <mvc:annotation-driven />

    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
            <value>/WEB-INF/pages/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>

</beans>

applicationContext.xml

<?xml  version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jee="http://www.springframework.org/schema/jee" xmlns:lang="http://www.springframework.org/schema/lang"
    xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
        http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"
    default-autowire="byName">

    <context:component-scan base-package="com.se.pl">
        <context:include-filter type="regex"
            expression="(service|dao|util)\..*" />
    </context:component-scan>
    <bean id="adminProps" name="adminProps"
        class="org.springframework.beans.factory.config.PropertiesFactoryBean">
        <property name="location" value="classpath:admin.properties">

Error

SEVERE: 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 'corelationDataServiceImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.se.pl.util.PropUtil com.se.pl.service.CorelationDataServiceImpl.propUtil; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'propUtil' defined in file [C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\admin\WEB-INF\classes\com\se\pl\util\PropUtil.class]: Invocation of init method failed; nested exception is java.lang.NullPointerException
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:287)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:605)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:925)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:472)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:383)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4939)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5434)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:976)
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1653)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

CorelationDataServiceImpl.java

package com.se.pl.service;

@Service
public class CorelationDataServiceImpl implements ICorelationDataService {

    @Autowired
    PropUtil propUtil;
    @Autowired
    CommonUtil commonUtil;
    @Autowired
    ICorelationDataDAO corelationDataDAO;
    @Autowired
    IReferenceDataDAO referenceDataDAO;

pom.xml (spring-*)

<spring.version>3.1.3.RELEASE</spring.version>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>3.6.0.Final</version>
        </dependency>

    <!-- Spring + Quartz dependencies -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>${spring.version}</version>
    </dependency>   

PropUtil.java

  package com.se.pl.util;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.se.pl.constants.PLConstants;

@Component
public class PropUtil implements InitializingBean { 

    @Autowired
    private Properties plProps;
    @Autowired
    private Properties adminProps;
    private static List<String> pColLst = new ArrayList<String>();
    private static List<String> pRefColLst = new ArrayList<String>();
    private static List<String> dpColLst = new ArrayList<String>();
    private static List<String> lColLst = new ArrayList<String>();
    private static List<String> pCorelColLst = new ArrayList<String>();
    private static String adminUserName = null;
    private static String adminPassword = null; 
    private static String userUserName = null;
    private static String userPassword = null;
    private static String desktopUrl = "";
    private static String mobileUrl = "";
    private static String mobileUsUrl = "";

    public List<String> getPartnerColumnNames()
    {
        return pColLst;
    }

    public List<String> getPartnerReferenceColumnNames()
    {
        return pRefColLst;
    }

    public List<String> getDefaultPointsColumnNames()
    {
        return dpColLst;
    }

    public List<String> getTranslationColumnNames()
    {
        return lColLst;
    }

    public List<String> getPartnerCorelColumnNames()
    {
        return pCorelColLst;
    }

    public String getDesktopUrl()
    {
        return desktopUrl;
    }

    public String getMobileUrl()
    {
        return mobileUrl;
    }

    public String getMobileUsUrl()
    {
        return mobileUsUrl;
    }   
    public String getAdminUserName()
    {
        return adminUserName;
    }
    public String getAdminPassword()
    {
        return adminPassword;
    }
    public String getUserUserName()
    {
        return userUserName;
    }
    public String getUserPassword()
    {
        return userPassword;
    }
    public void afterPropertiesSet() throws Exception {
        String pColNames =  adminProps.getProperty("pl.excel.columns.partners");
        String pRefColNames =  adminProps.getProperty("pl.excel.columns.partnerreferences");
        String dpColNames = adminProps.getProperty("pl.excel.columns.defaultpoints");
        String lColNames =  adminProps.getProperty("pl.excel.columns.language");
        String pCorelColNames =  adminProps.getProperty("pl.excel.columns.partnercorelation");
        adminUserName = adminProps.getProperty(PLConstants.PL_LOGIN_ADMIN_USERNAME, PLConstants.PL_ADMIN_DEFAULT_USERNAME);
        adminPassword = adminProps.getProperty(PLConstants.PL_LOGIN_ADMIN_PASSWORD, PLConstants.PL_ADMIN_DEFAULT_PASSWORD);     
        userUserName = adminProps.getProperty(PLConstants.PL_LOGIN_USER_USERNAME, PLConstants.PL_USER_DEFAULT_USERNAME);
        userPassword = adminProps.getProperty(PLConstants.PL_LOGIN_USER_PASSWORD, PLConstants.PL_USER_DEFAULT_PASSWORD);
        pColLst = Arrays.asList(pColNames.split(","));
        pRefColLst = Arrays.asList(pRefColNames.split(","));
        dpColLst = Arrays.asList(dpColNames.split(","));
        lColLst = Arrays.asList(lColNames.split(","));
        pCorelColLst = Arrays.asList(pCorelColNames.split(","));
        desktopUrl =  plProps.getProperty("desktop.url");
        mobileUrl = plProps.getProperty("mobile.url");
        mobileUsUrl = plProps.getProperty("mobile_us.url");

    }
}

"Invocation of init method failed" exception means you have @PostConstruct annotation in your PropUtil class. And Spring failed to execute this method due to NullPointerException .

You are reading the properties file in the afterPropertiesSet method which is where you use the extracted properties to call split on them. Isnt this the only place where there can be a nullpointer? Since your config looks fine. I think the best way is to look at the properties file and check if every attribute mentioned in the afterPropertiesSet() method is present or not.

The null has to be in one of these properties where you might have missed out mentioning one of them, since those are the only properties which are used later on in the same method

String pColNames =  adminProps.getProperty("pl.excel.columns.partners");
String pRefColNames =  adminProps.getProperty("pl.excel.columns.partnerreferences");
String dpColNames = adminProps.getProperty("pl.excel.columns.defaultpoints");
String lColNames =  adminProps.getProperty("pl.excel.columns.language");
String pCorelColNames =  adminProps.getProperty("pl.excel.columns.partnercorelation");

All of the autowired fields must be declared as beans and located within a package that is being scanned by your component scanner.

To make these classes beans add the @Component annotation:

@Component
public class PropUtil{

}

Then make sure they are within a package that is being scanned for components by Spring. One trick to determine this is to set logging to the INFO level. Then scan the logging messages at startup. Spring will list every bean it has found and I believe the packages scanned.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM