从组件调用的自动装配服务在使用 new 关键字调用时给出空指针
autowired service called from a component giving null pointer when called with new keyword
我有一个问题,我必须使用数组阻塞队列服务,我的架构就像这样:
控制器:
@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();
}
}
而且我有 consumeFileData 和 readFileData 的实现。现在的问题是当我在 consumeFileData 中调用自动装配的 adhocService.consume() :
但它不起作用:
给我
作为 adhocService 对象的空指针为空
谁能帮忙
调用方法时不会出现问题,spring一启动就会出现问题。
AdhocTasks
是一个 spring 组件。所以它的构造函数被调用为任何 bean。但是由于它的构造函数有参数,每个参数都必须被视为一个依赖项,所以 Spring 尝试将它们与 spring bean 连接起来。
第一个问题:大多数参数都找不到匹配的候选 bean,第二个问题:您不想自动装配这些参数。
作为解决方法,稍微更改一下您的设计。
不要让 AdhocTasks
成为 spring bean,因为你不想要它,而不是注入它需要的服务,而是在实例化时将它作为参数传递:
@Autowired
private AdhocService adhocService;
//..
producerPool.submit(new AdhocTasks(adhocService, false, inputStream, delimiter, quoteChar, fileName, type, report, desc));
我有一个问题,我必须使用数组阻塞队列服务,我的架构就像这样:
控制器:
@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();
}
}
而且我有 consumeFileData 和 readFileData 的实现。现在的问题是当我在 consumeFileData 中调用自动装配的 adhocService.consume() :
但它不起作用: 给我
作为 adhocService 对象的空指针为空
谁能帮忙
调用方法时不会出现问题,spring一启动就会出现问题。
AdhocTasks
是一个 spring 组件。所以它的构造函数被调用为任何 bean。但是由于它的构造函数有参数,每个参数都必须被视为一个依赖项,所以 Spring 尝试将它们与 spring bean 连接起来。
第一个问题:大多数参数都找不到匹配的候选 bean,第二个问题:您不想自动装配这些参数。
作为解决方法,稍微更改一下您的设计。
不要让 AdhocTasks
成为 spring bean,因为你不想要它,而不是注入它需要的服务,而是在实例化时将它作为参数传递:
@Autowired
private AdhocService adhocService;
//..
producerPool.submit(new AdhocTasks(adhocService, false, inputStream, delimiter, quoteChar, fileName, type, report, desc));