[英]Spring @Autowired field returns null
我試圖在Tomcat上運行Spring 3 + Struts 2 + Hibernate Web應用程序,但它無法以自動裝配字段的NullPointerException啟動。 我檢查了其他類似的問題,但無法解決我的問題。 我是Spring和Struts的新手。
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中
<?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">
錯誤
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");
}
}
“調用init方法失敗”異常意味着您在PropUtil
類中有@PostConstruct
注釋。 由於NullPointerException
,Spring無法執行此方法。
您正在讀取afterPropertiesSet方法中的屬性文件,在該方法中,您使用提取的屬性來調用它們上的拆分。 這不是唯一可以存在nullpointer的地方嗎? 由於您的配置看起來很好。 我認為最好的方法是查看屬性文件並檢查afterPropertiesSet()方法中提到的每個屬性是否存在。
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");
所有自動裝配的字段必須聲明為bean,並且位於組件掃描程序正在掃描的包中。
要使這些類bean添加@Component
批注:
@Component
public class PropUtil{
}
然后確保它們位於Spring正在掃描組件的包中。 確定這一點的一個技巧是將日志記錄設置為INFO
級別。 然后在啟動時掃描日志記錄消息。 Spring將列出它找到的每個bean,我相信掃描的包。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.