我在测试一些东西时遇到了这种奇怪的行为。
我想做什么
比如说,我想使用本地文件、请求或其他方式将一些值预加载到存储库中。
通常我会把这些放在一个构造器中,像这样:
@Service
public class PointOfInterestService {
@Autowired
private PointOfInterestRepository pointOfInterestRepository;
public PointOfInterestService() {
try {
String jsonStr = Helper.isToString(new FileInputStream(new File("test.json")));
JSONObject json = new JSONObject(jsonStr);
JSONArray entries = json.getJSONArray("features");
for (Object element : entries) {
try {
//new PointOfInterest(...)
//read file and do stuff
//...
//finally, let's save the object
this.registerPointOfInterest(pointOfInterest);
}
} catch (Exception e) {
if (!(e instanceof JSONException)) {
e.printStackTrace();
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void registerPointOfInterest(PointOfInterest pointOfInterest) {
pointOfInterestRepository.save(pointOfInterest);
}
}
当构造函数运行时,每当抛出registerPointOfInterest
时,就会弹出一个NullPointerException
。
使用调试器,我意识到由于某种原因,存储库是null(因此抛出异常。
这是repository类,非常简单:
package com.example.demo.PointOfInterest;
import org.springframework.data.jpa.repository.JpaRepository;
public interface PointOfInterestRepository extends JpaRepository<PointOfInterest, String> {
}
在构造函数中读取上述文件有什么简单的解决方法吗?谢谢!
你可以试试这个:
@Service
public class PointOfInterestService {
private PointOfInterestRepository pointOfInterestRepository;
public PointOfInterestService(
@Autowired PointOfInterestRepository pointOfInterestRepository
) {
this.pointOfInterestRepository = pointOfInterestRepository;
}
您还可以删除构造函数中的@Autowired,因为spring自动知道必须执行DI。
@Service
public class PointOfInterestService {
private PointOfInterestRepository pointOfInterestRepository;
public PointOfInterestService(
PointOfInterestRepository pointOfInterestRepository
) {
this.pointOfInterestRepository = pointOfInterestRepository;
}
如果您有一个构造函数,那么Spring不会自动连接存储库(因此服务本身不是单例)。你应该用别的东西来改变构造器。
对于任何感兴趣的人,我实际上通过删除构造函数,并在私有方法上使用@PostConstruct
注释,解决了这个问题,如下所示:
@PostConstruct
private void readGeoJson() {
....
}
谢谢大家!
在我的springbootapp中,我有以下存储库:- 当我运行这个应用程序时。我收到了这个错误:- 启动ApplicationContext时出错。要显示条件报告,请在启用“调试”的情况下重新运行应用程序。2020-12-24 21:09:15 - 应用程序启动失败 说明: com中构造函数的参数0。如何使用Java。演示。存储库。RevisionRepository需要“org”类型的bean
我正在试验Spring和MongoDB。在我的项目中,我有一个存储库和一个有调度方法的服务。问题是,存储库没有自动运行,它总是为空。 Autowire在主应用程序类中正常工作(通过实现CommandLineRunner进行测试) 我错过什么了吗? 目录 机器应用。JAVA 工人JAVA LineDataRepository
我试图在MessageBoxDAO类中自动连接jdbctemplate(我想它工作得很好),然后我在控制器中创建自动连接的DAO对象来获取最新的ID,以防止获取重复的ID,并从它结束的地方开始。 代码如下: 由于我未知的原因,“dao”为空,因此无法构造计数器,程序停止 我刚接触spring boot,我知道这可能是一个非常简单的问题,但有人能指出我错在哪里吗?
根据我的理解,当创建了临时对象时,将调用move构造函数。这里,函数返回一个临时对象,但我的程序没有打印来自移动构造函数的消息:
我想知道以下解决方案之间的区别是什么,为什么使用解决方案2?有什么好处吗? 解决方案一: 解决方案2:
问题内容: 我写了一个实现Runnable的类,以同时运行到另一个线程。主线程处理侦听串行端口,而第二个线程将处理向该端口发送数据。 第一个线程从第二个开始,如下所示: 这可行,但是我的编译器会标出警告语:在构造函数中启动新线程很危险。为什么是这样? 这个问题的第二部分是:如何在一个线程(串行端口侦听线程)中运行循环,并在第二个线程中键入退出命令。如何获得第一个终止的线程?谢谢。 问题答案: 你的