使用 Spring Boot 服务作为批处理作业中的依赖项的空指针异常

Posted

技术标签:

【中文标题】使用 Spring Boot 服务作为批处理作业中的依赖项的空指针异常【英文标题】:Null Pointer Exception using Spring Boot service as a dependency in a batch job 【发布时间】:2021-09-28 08:27:20 【问题描述】:

我正在重新使用一个旧的、独立的、基于 AWT 的 Java 类,它可以备份和恢复 mysql 数据库。

它需要做的一件事是解密从属性文件中读取的密码。

此逻辑包含在 Spring Boot 应用程序中。

我在独立类中实例化加密服务和解密器,如下所示:

DecryptionService decryptionService = new DecryptionService();

decryptionService 使用@AutoWired 注解创建解密器:

@Autowired
private IRSADecryptor decryptor;

现在,我在与服务相同的项目中运行 Eclipse。

当我尝试如下解密密码时:

    String decryptedPassword = decryptionService.decryptTextUsingProductKeys("abc");

调试器显示decryptionService为空。

这是堆栈跟踪的前几行:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at com.ap.services.decryption.service.DecryptionService.decryptTextUsingProductKeys(DecryptionService.java:21)
    at com.ilcore.util.SosaMaintenanceJFrame.jButtonDatabaseBackupActionPerformed(SosaMaintenanceJFrame.java:529)
    at com.ilcore.util.SosaMaintenanceJFrame$6.actionPerformed(SosaMaintenanceJFrame.java:207)

我很确定我不会以正确的方式进行此操作,但我不想导入解密逻辑。我有哪些选择?

【问题讨论】:

您是否设法解决了依赖注入问题? 是的,实际上我需要实例化的是解密服务中的解密器。 如果我的回答对你有帮助,请采纳为正确答案,谢谢! 【参考方案1】:

@Autowired 注释不会创建您的解密器对象,但会尝试定位该类型的Bean 并将其注入您的DecryptionService。这意味着您不应该使用构造函数来实例化您的DecryptionServiceDecryptionService 应定义为 @Service 并注入另一个组件(@Component@Controller 等),您将在其中调用特定方法来解密数据。

【讨论】:

谢谢。对于历史,我确实实例化了它,但这有帮助。

以上是关于使用 Spring Boot 服务作为批处理作业中的依赖项的空指针异常的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 批处理作业识别

如果从计划的作业中调用,Spring Boot 存储库不会保存到数据库

Spring Boot,Cron作业同步

在 Spring Batch 中以最后处理的记录作为 jobParameter 启动一个新的作业实例?

在 Spring Boot 应用程序中嵌入带有作业定义的 Spring Batch Admin

使用 Redshift 作为 Spring 批处理作业存储库和 Redshift 中 SEQUENCE 的替代品