Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从MongoTemplate获取集合的NullPointerException_Java_Spring_Mongodb_Multithreading_Spring Boot - Fatal编程技术网

Java 从MongoTemplate获取集合的NullPointerException

Java 从MongoTemplate获取集合的NullPointerException,java,spring,mongodb,multithreading,spring-boot,Java,Spring,Mongodb,Multithreading,Spring Boot,这是我的问题。我有一个Spring引导应用程序连接到MongoDB。我创建了一个RESTful API,在控制器上使用MongoTemplate,没有返回任何错误。但是现在,我想创建一个线程,在运行应用程序时分析一些数据。问题在于,在该线程初始化之后,当代码到达连接到数据库或将集合分配给变量的语句时,它返回一个NullPointerException 返回错误的代码如下所示: 公共类处理线程实现可运行{ @自动连线 MongoTemplate MongoTemplate; MongoCollec

这是我的问题。我有一个Spring引导应用程序连接到MongoDB。我创建了一个RESTful API,在控制器上使用
MongoTemplate
,没有返回任何错误。但是现在,我想创建一个线程,在运行应用程序时分析一些数据。问题在于,在该线程初始化之后,当代码到达连接到数据库或将集合分配给变量的语句时,它返回一个
NullPointerException

返回错误的代码如下所示:

公共类处理线程实现可运行{
@自动连线
MongoTemplate MongoTemplate;
MongoCollection度量值=mongoTemplate.getCollection(“度量值”);
@凌驾
公开募捐{
试一试{
Date today=新日期(System.currentTimeMillis());
List pipeline=Arrays.asList(
匹配(和(
gte(“日期”,新java.util.date(1598464800000L)),
lte(“日期”,新java.util.date(1598540400000L)),
排序(排序依据(降序(“日期”)、降序(“小时”)),
集团(和(均衡器(“设备”)、“$设备”)、均衡器(“工厂”)、“$工厂”),
推送(“测量值”,“$$ROOT”),
项目(不包括(“测量值id”、“测量值工厂”、“测量值设备”、“测量值等级”));
可聚合结果=测量值。聚合(管道、分析测量值。类别);
//TODO:分析结果
}捕获(例外e){
Log.logger.error(“出现了一些错误”+e);
}
}
}
使用该代码,它将返回错误:

线程“restartedMain”java.lang.reflect.InvocationTargetException中出现异常 位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 位于java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 位于java.base/java.lang.reflect.Method.invoke(Method.java:564) 位于org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) 原因:java.lang.NullPointerException 位于com.rainforest.eco.analytics.TreatmentThread.(TreatmentThread.java:35) 位于com.rainforest.eco.Application.main(Application.java:25) ... 还有5个

如果我直接尝试在代码中获取集合,它只返回一个
NullPointerException
,而不提供更多细节

线程在
应用程序中启动。java
类:

@springboot应用程序
公共类应用程序{
公共静态void main(字符串[]args){
SpringApplication.run(Application.class,args);
Log.logger.info(“起始线程:处理线程”);
Log.logger.info(“起始线程:分析pot测量以安排治疗”);
//创建包含10个线程的池
int numThreads=10;
final ScheduledExecutorService schExService=Executors.newScheduledThreadPool(numThreads);
//创建可运行线程
最终可运行的treatmentAnalyzer=新的TreatmentThread();
//线程调度
整数分钟=60;
schExService.scheduleWithFixedDelay(治疗分析仪,分钟,5*分钟,时间单位:秒);
Log.logger.info(“线程已启动:当前正在运行”);
}
}

有人知道错误的来源吗?

使用
new
操作符实例化
TreatmentThread
不会自动关联依赖项。因此,
MongoTemplate MongoTemplate
null
,对它的后续调用将抛出NPE

您需要在
应用程序
类中自动关联此类对象,并将其定义为bean(类级别的
@Component
或方法级别的
@bean
):


使用
new
操作符实例化
TreatmentThread
不会自动关联依赖项。因此,
MongoTemplate MongoTemplate
null
,对它的后续调用将抛出NPE

您需要在
应用程序
类中自动关联此类对象,并将其定义为bean(类级别的
@Component
或方法级别的
@bean
):


应用程序代码中还有什么需要更改的吗?这是我第一次创建SpringBoot应用程序,因此我仍然习惯于所有依赖项、自动连线等。现在,它返回一个错误,表示它重新查询类型为
TreatmentThread
@PabloAcereda的Bean:查看我的编辑。我建议您从这里开始:我应用了您建议的更改,但它似乎不起作用。现在它返回错误
org.springframework.beans.factory.BeanCreationException
。虽然我可能错过了一些东西。我实施的唯一更改是您编辑的答案上的更改。应用程序代码中还有什么需要更改的吗?这是我第一次创建SpringBoot应用程序,因此我仍然习惯于所有依赖项、自动连线等。现在,它返回一个错误,表示它重新查询类型为
TreatmentThread
@PabloAcereda的Bean:查看我的编辑。我建议您从这里开始:我应用了您建议的更改,但它似乎不起作用。现在它返回错误
org.springframework.beans.factory.BeanCreationException
。虽然我可能错过了一些东西。我实施的唯一更改是您编辑的答案上的更改。在代码
TreatmentThread
中,线程不是以spring方式创建的。您已经使用代码
TreatmentThread
中的代码片段创建了
TreatmentThread
类的实例
@Component
public class TreatmentThread implements Runnable {
   ...
}
@SpringBootApplication
public class Application {

    @Autowired
    TreatmentThread treatmentThread;

    ...
}