gpt4 book ai didi

java - 从组件调用的 Autowiring 服务在使用 new 关键字调用时给出空指针

转载 作者:行者123 更新时间:2023-12-02 01:18:35 26 4
gpt4 key购买 nike

我遇到一个问题,我必须使用数组阻塞队列服务,而我的架构如下:

Controller :

@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();

我这里还有更多方法

组件:

在 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();
}

}

我有 ConsumerFileData 和 readFileData 的实现。现在的问题是当我在 ConsumerFileData 中调用自动连线的 adhocService.consume() 时:

但它不起作用:给我

空指针作为 adhocService 对象为空

谁能帮忙

最佳答案

调用方法的时候不会出现这个问题,spring一启动就出现这个问题。

AdhocTasks 是一个 spring 组件。因此它的构造函数会像任何 bean 一样被调用。但由于它的构造函数有参数,每个参数都必须被视为依赖项,因此 Spring 尝试使用 spring beans 连接它们。
第一个问题:大多数参数都找不到匹配的候选 bean,第二个问题:您不想 Autowiring 这些参数。

作为解决方法,稍微改变一下你的设计。不要将 AdhocTasks 设为 spring bean,因为您不希望这样,并且不要注入(inject)它所需的服务,而是在实例化该服务时将其作为参数传递:

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

关于java - 从组件调用的 Autowiring 服务在使用 new 关键字调用时给出空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58158234/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com