автопроводная служба, вызываемая из компонента, дающего нулевой указатель при вызове с новым ключевым словом - PullRequest
0 голосов
/ 29 сентября 2019

У меня проблема, когда мне нужно использовать службу очереди массива, а моя архитектура выглядит следующим образом:

Контроллер:

@controller---
@Autowired
private AdhocService adhocService;

@RequestMapping(value = "/upload", method = RequestMethod.POST)
    public String uploadFile(){
        adhocService.processFile();

}

Служба:

У меня естьметод, из которого я начинаю новые потоки для чтения и записи с использованием очереди блокирования массива

    @service
-----
    public void processFileData(InputStream inputStream, Character delimiter, Character quoteChar,String fileName,String type, String report, String desc)
        {


        try {
        long startTime = System.nanoTime();

            ExecutorService producerPool = Executors.newFixedThreadPool(1);
            ExecutorService consumerPool = Executors.newFixedThreadPool(1);
            producerPool.submit(new AdhocTasks(false, inputStream, delimiter, quoteChar, fileName, type, report, desc));
            consumerPool.submit(new AdhocTasks(true, null, null, null, null, null, null, null));    
            producerPool.shutdown();
            consumerPool.shutdown();

у меня есть здесь и другие методы

component:

В файле adhoctaskобъявлен как компонент:

    @Component
    public class AdhocTasks implements Runnable,QueueService {


    @Autowired
    private AdhocService adhocService;


    //CONSTRUCTOR - PARAMETERIZED

    public AdhocTasks(Boolean consumer, InputStream stream, Character delimiter,Character quoteChar,String fileName,String type, String report, String desc) {
        this.isConsumer=consumer;
        this.stream = stream;
        this.delimiter=delimiter;
        this.quoteChar=quoteChar;
        this.fileName = fileName;
        this.type = type;
        this.report = report;
        this.desc = desc;

    }

@Override
    public void run() {


        if(this.isConsumer) {
            consumeFileData();
        }else {
            readFileData();
        }

    }

И у меня есть реализации потреблениеFileData и readFileData. Теперь проблема заключается в том, что когда в функции acceptFileData я вызываю autowired adhocService.consume ():

, но он не работает: дает мне

нулевой указатель, поскольку объект adhocService имеет значение null

может кто-нибудь помочь

1 Ответ

2 голосов
/ 29 сентября 2019

Проблема не возникает при вызове метода, проблема возникает, как только весенний запуск.

AdhocTasks является компонентом пружины. Таким образом, его конструктор вызывается как для любого компонента. Но поскольку его конструктор имеет параметры, каждый параметр должен рассматриваться как зависимость, поэтому Spring пытается связать их с bean-компонентами Spring.
Первая проблема: большинство параметров не найдут подходящие компоненты-бины, и вторая проблема: вы не обращаете вниманияне хочу автоматически связывать эти параметры.

В качестве обходного пути, немного измените свой дизайн. Не делайте AdhocTasks пружинным компонентом, так как вы этого не хотите, и вместо того, чтобы вводить требуемый сервис, передайте его в качестве параметра при создании экземпляра:

@Autowired
private AdhocService adhocService;
//..
producerPool.submit(new AdhocTasks(adhocService, false, inputStream, delimiter, quoteChar, fileName, type, report, desc));
...