2016-06-09 51 views
0

我是新來的spring並在上下文初始化期間看到NullPointerException。以下是錯誤味精Java-Spring:上下文初始化期間的NullPointerException(使用@Component,@Autowired,上下文:組件掃描)

10:23:43,231 WARN [ClassPathXmlApplicationContext] Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'RoxourProcessor' defined in file [C:\my_sand\branch\Roxour-client-api\target\classes\company\online\Roxour\api\batchOperations\RoxourProcessor.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [company.online.Roxour.api.batchOperations.RoxourProcessor]: Constructor threw exception; nested exception is java.lang.NullPointerException 
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'RoxourProcessor' defined in file [C:\my_sand\branch\Roxour-client-api\target\classes\company\online\Roxour\api\operation\RoxourProcessor.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [company.online.Roxour.api.batchOperations.RoxourProcessor]: Constructor threw exception; nested exception is java.lang.NullPointerException 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1105) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1050) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) 
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) 
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) 
at company.online.Roxour.api.RoxourMasterProcessor.main(RoxourMasterProcessor.java:170) 

在這裏,在我的context.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:context="http://www.springframework.org/schema/context" 
    xmlns:util="http://www.springframework.org/schema/util" 
    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/util http://www.springframework.org/schema/util/spring-util-3.1.xsd"> 


<!-- Scans within the base package of the application for @Components to configure as beans --> 
<context:component-scan base-package="org.online.Roxour.api"/> 

這裏是主類:

package org.online.Roxour.api; 

public class RoxourMasterProcessor 
{ 
...... 

@Autowired 
RoxourProcessor processor; 

........ 

public void process() 
{ 
    ....... 
    processor.runJob(); 
    ........... 
} 

public static void main(String args[]) 
{ 

    ApplicationContext context = new ClassPathXmlApplicationContext("context.xml"); 
    LOG.info("Context: " + context); 
    RoxourMasterProcessor master = context.getBean(RoxourMasterProcessor.class); 

    master.process(); 

} 
} 

在一個子包org.online.Roxour.api.utils中,我有ApplicationEnvironment和RoxourUtil類。像:

package org.online.Roxour.api.utils; 

@Component 
public class ApplicationEnvironment 
{ 
public ApplicationEnvironment() 
{ 
    Properties properties = new Properties(); 
    try 
    { 
     LOG.info("Initiating Application Environment"); 
     properties.load(this.getClass().getClassLoader().getResourceAsStream("application.properties")); 
     load(properties); 
    } 
    catch (Throwable e) 
    { 
     String msg = "Error loading environment config.";      
     LOG.error(msg,e); 

     System.exit(1); 
    } 
} 
} 

package org.online.Roxour.api.utils; 

@Component 
@Scope("prototype") 
public class RoxourUtil 
{ 
........ 

@Autowired 
ApplicationEnvironment applicationEnvironment; 

......... 

} 

在另一個分裝org.online.Roxour.api.operation,我有類RoxourProcessor:

package org.online.Roxour.api.operation; 

@Component 
@Scope("singleton") 
public class RoxourProcessor 
{ 

    ......... 

    private int PAYLOAD_SIZE; 

    private int MAX_READER_THREADS; 
    private int MAX_WORKER_THREADS; 

    @Autowired 
    ApplicationEnvironment applicationEnvironment; 

    @Autowired 
    RoxourUtil util; 

    public RoxourProcessor() 
    { 
     PAYLOAD_SIZE = applicationEnvironment.getPayloadSize(); 
     MAX_READER_THREADS = applicationEnvironment.getMaxReaderThreads(); 
     MAX_WORKER_THREADS = applicationEnvironment.getMaxWorkerThreads(); 
    } 

    .............. 

} 

在上下文初始化,我看到:

@Autowired

ApplicationEnvironment applicationEnvironment;

@Autowired

RoxourUtil util;

爲空。因此從RoxourProcessor構造函數獲取NULLPointerException。

但不理解它如何找不到那些2 autowired。我錯過了什麼?

任何幫助表示讚賞。

謝謝

回答

1

字段注入發生在構造函數調用之後。 用@PostConstruct方法替換構造函數,你應該沒問題。

@PostConstruct public void initialize(){ 
    PAYLOAD_SIZE = applicationEnvironment.getPayloadSize(); 
    MAX_READER_THREADS = applicationEnvironment.getMaxReaderThreads(); 
    MAX_WORKER_THREADS = applicationEnvironment.getMaxWorkerThreads(); 
} 

這是原因很多領域注入(或setter注入,對於這個問題)被認爲是一個壞主意,這些日子之一。您應該更喜歡構造函數注入,它使您的服務不可變且易於測試,並且在初始化期間不會遇到競爭條件。

+0

非常感謝。有效 – Patty

相關問題