-2

У меня есть мое основное приложение, аннотированное с помощью @SpringBootApplication. Вот код для следующего:NullPointerException при попытке @Autowired WorkerThread

@SpringBootApplication 
    public class Application { 

     private Logger logger = LoggerFactory.getLogger(Application.class); 

     @Autowired 
     public ExternalConfiguration configuration; 

     @Autowired 
     WorkerThread workerThread; 

     public static void main(String[] args) { 
      SpringApplication springApplication = new SpringApplication(new Object[] { Application.class }); 
      springApplication.run(args); 
     } 
    } 

А вот мой WorkerThread.java

@Component 
@Scope("prototype") 
public class WorkerThread implements Runnable { 
    @Autowired 
    private ApplicationContext applicationContext; 

    @Autowired 
    ExternalConfiguration externalConfiguration; 

    @Autowired 
    WorkerConfig workerConfig; 

    WorkerQueueDispatcher dispatcher; 

    public WorkerThread() { 
     dispatcher = applicationContext.getBean(WorkerQueueDispatcher.class, externalConfiguration.getEventQ(), 
       workerConfig.getWorkers()); 
    } 

    @Override 
    public void run() { 
     logger.info("Worker thread started. Thread ID :" + Thread.currentThread().getId()); 
     dispatcher.run(); 
    } 
} 

Я пытался отладки и узнал, что мой ApplicationContext не получал Autowired и является недействительным.

Я не использовал новый для создания экземпляра WorkerThread.

Пожалуйста, помогите мне.

+0

Возможная Дубликат [Что такое NullPointerException, и как это исправить?] (Http://stackoverflow.com/questions/218384/what- is-a-nullpointerexception-and-how-do-i-fix-it) – xenteros

+0

Очевидно, что я знаю, что такое NullPointerException. Я говорю о том, что ApplicationContext не получает @Autowired и, следовательно, он равен нулю. Пожалуйста, внимательно прочитайте вопрос. – amitection

+0

Просьба указать трассировку стека при вызове NPE во время доступа к контексту приложения. –

ответ

1

Вашей проблема заключается в том, что вы используете autowired поля в конструкторе здесь:

public WorkerThread() { 
     dispatcher = applicationContext.getBean(WorkerQueueDispatcher.class, externalConfiguration.getEventQ(), 
      workerConfig.getWorkers()); 
    } 

Конструктор вызывается весной, прежде чем она способна придать эту зависимость. Поэтому все они null.

У вас есть два варианта:

  1. Do инициализацию в @PostContruct вместо конструктора.
  2. Встраиваться конструктор (это хорошая практика в любом случае)
+0

Спасибо! Я давно это понял. – amitection