简体   繁体   English

Spring @Autowired字段返回null

[英]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. 我试图在Tomcat上运行Spring 3 + Struts 2 + Hibernate Web应用程序,但它无法以自动装配字段的NullPointerException启动。 I have checked other similar questions but couldn't solve my problem. 我检查了其他类似的问题,但无法解决我的问题。 I am new to Spring and Struts. 我是Spring和Struts的新手。

mvc-dispatcher-servlet.xml MVC-调度-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 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 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-*) 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 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. “调用init方法失败”异常意味着您在PropUtil类中有@PostConstruct注释。 And Spring failed to execute this method due to NullPointerException . 由于NullPointerException ,Spring无法执行此方法。

You are reading the properties file in the afterPropertiesSet method which is where you use the extracted properties to call split on them. 您正在读取afterPropertiesSet方法中的属性文件,在该方法中,您使用提取的属性来调用它们上的拆分。 Isnt this the only place where there can be a nullpointer? 这不是唯一可以存在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. 我认为最好的方法是查看属性文件并检查afterPropertiesSet()方法中提到的每个属性是否存在。

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 null必须位于其中一个属性中,您可能错过了提及其中一个属性,因为这些属性是以后在同一方法中使用的唯一属性

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. 所有自动装配的字段必须声明为bean,并且位于组件扫描程序正在扫描的包中。

To make these classes beans add the @Component annotation: 要使这些类bean添加@Component批注:

@Component
public class PropUtil{

}

Then make sure they are within a package that is being scanned for components by Spring. 然后确保它们位于Spring正在扫描组件的包中。 One trick to determine this is to set logging to the INFO level. 确定这一点的一个技巧是将日志记录设置为INFO级别。 Then scan the logging messages at startup. 然后在启动时扫描日志记录消息。 Spring will list every bean it has found and I believe the packages scanned. Spring将列出它找到的每个bean,我相信扫描的包。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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