当前位置: 首页 > 知识库问答 >
问题:

Java Spring——为什么自动连线存储库在服务构造函数中为空?[重复]

施宏大
2023-03-14

我在测试一些东西时遇到了这种奇怪的行为。

我想做什么

比如说,我想使用本地文件、请求或其他方式将一些值预加载到存储库中。

通常我会把这些放在一个构造器中,像这样:

@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> {
}

在构造函数中读取上述文件有什么简单的解决方法吗?谢谢!

共有3个答案

公冶森
2023-03-14

你可以试试这个:

@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;
}
壤驷宏才
2023-03-14

如果您有一个构造函数,那么Spring不会自动连接存储库(因此服务本身不是单例)。你应该用别的东西来改变构造器。

阳修永
2023-03-14

对于任何感兴趣的人,我实际上通过删除构造函数,并在私有方法上使用@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的类,以同时运行到另一个线程。主线程处理侦听串行端口,而第二个线程将处理向该端口发送数据。 第一个线程从第二个开始,如下所示: 这可行,但是我的编译器会标出警告语:在构造函数中启动新线程很危险。为什么是这样? 这个问题的第二部分是:如何在一个线程(串行端口侦听线程)中运行循环,并在第二个线程中键入退出命令。如何获得第一个终止的线程?谢谢。 问题答案: 你的