CRUD存储库在“简单” Java类中不起作用

时间:2019-03-12 12:27:28

标签: java spring

我有一个带有CRUD存储库和mysql数据库的spring-boot应用程序。当我在REST控制器中使用此存储库时,没有任何问题,但是我需要在简单的Java类中使用一个存储库,但是它不起作用。

我想加载列表中的所有residentStatEntities以写入CSV文件,但无法加载。

这是我的代码:

CRUD存储库:

@Repository
public interface ResidentStatDBRepository extends CrudRepository<ResidentStatEntity, Long> {
    List<ResidentStatEntity> findAll();
}

Java类:

public class ResetDB {

    /**
     * CRUD Repository
     */
    @Autowired
    private  ResidentStatDBRepository residentStatDBRepository;



    /**
     * Delete DB and save his content in a CSV file
     * @throws Exception
     */
    public void save()throws Exception{
        //open file
        String csvFile = "residentStat.csv";
        FileWriter writer = new FileWriter(csvFile, true);
        //get list of all stat
        List<ResidentStatEntity> residentStatEntities = residentStatDBRepository.findAll();
}

这是控制台中打印的消息:

java.lang.NullPointerException
    at com.example.sems.ResetDB.save(ResetDB.java:36)
    at com.example.sems.SemsApplication$1.run(SemsApplication.java:52)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)

这是我使用ResetDB类的地方

@SpringBootApplication
public class SemsApplication {

    public static void main(String[] args) {
        SpringApplication.run(SemsApplication.class, args);
        int MINUTES = 1; // The delay in minutes
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() { // Function runs every MINUTES minutes.
                try{
                    new ResetDB().save();
                    System.out.println("ok");
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }, 0, 1000 * 60 * MINUTES);
        // 1000 milliseconds in a second * 60 per minute * the MINUTES variable.
    }
}

我每分钟调用一次此函数,也许是因为它在main方法中?

预先感谢您的回答:)

2 个答案:

答案 0 :(得分:0)

ResetDB不是Spring托管的bean。

用@Component注释ResetDB,它应该可以解决问题。

答案 1 :(得分:0)

为了使ResetDB能够使用Spring注入管理Bean,ResetDB本身必须由该系统实例化。

@Component批注添加到ResetDB类中,并使ResetDB的实例也自动连线。