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

带有@Autowired存储库的SpringBootApp NullPointerException

华子昂
2023-03-14

这是我的Spring Boot应用程序。当我运行main方法时,总是抛出一个空指针异常。我不知道为什么@Autowired JsonReaderService是空的。我把它定义为组件。

它是项目src文件夹中的子文件夹,因此主方法位于源文件夹之上。所以spring应该正确扫描它??

 @SpringBootApplication
 public class DemoApplication {

@Autowired
private JsonReaderService jsonReaderService;

private static JsonReaderService stat_jsonReaderService;

static Logger logger = LoggerFactory.getLogger(DemoApplication.class);

public static void main(String[] args) throws IOException {

    String textFileName = scanFileName();
    Reader reader = Files.newBufferedReader(Paths.get("src/main/resources/" + textFileName));
    // This line is always null pointer exception. The @autowired Annotation don't work with my JsonReaderService????? WHY
    List<EventDataJson> jsonReaderServicesList = stat_jsonReaderService.readEventDataFromJson(reader);
    stat_jsonReaderService.mappingToDatabase(jsonReaderServicesList);

}

public static String scanFileName() {
    logger.info("Scanning keyboard input");
    System.out.println("enter a file to scan");
    Scanner scanInput = new Scanner(System.in);
    String text = scanInput.nextLine();
    logger.info("successful keyboard input was : " + text);
    return text;
}

@PostConstruct
public void init() {
    logger.info("initializing Demo Application");
    stat_jsonReaderService = jsonReaderService;
}

}
@Component
public class JsonReaderService {
static Logger logger = LoggerFactory.getLogger(DemoApplication.class);
@Autowired
EventDataRepository repository;
private Reader reader;
private List<EventDataJson> eventDataList;

@Autowired
public JsonReaderService(){}

public List<EventDataJson> readEventDataFromJson(Reader reader) throws IOException {

    try {
        logger.info("parsing event data from json started");
        Gson gson = new Gson();
        EventDataJson[] eventData = gson.fromJson(reader, EventDataJson[].class);
        eventDataList = Arrays.asList(eventData);
        reader.close();
    } catch (IOException e) {
        logger.error("Error while reading the json file");
        e.printStackTrace();
    }
    logger.info("parsing json eventData successful finished");
    return eventDataList;
}

public Boolean mappingToDatabase(List<EventDataJson> eventDataList) {
    logger.info("mapping from json to database eventData started ...");

    Set<String> idList = eventDataList.stream().map(EventDataJson::getId).collect(Collectors.toSet());
    for (String id : idList
    ) {
        Stream<EventDataJson> filteredEventDataList1 = eventDataList.stream().filter((item) -> item.getId().equals(id));
        Stream<EventDataJson> filteredEventDataList0 = eventDataList.stream().filter((item) -> item.getId().equals(id));
        EventDataJson startedEvent = filteredEventDataList1.filter((item) -> item.getState().equals("STARTED")).findAny().orElse(null);
        EventDataJson finishedEvent = filteredEventDataList0.filter((item) -> item.getState().equals("FINISHED")).findAny().orElse(null);
        long duration0 = finishedEvent.getTimestamp() - startedEvent.getTimestamp();
        Boolean alert;
        if (duration0 > 4) {
            alert = true;
        } else {
            alert = false;
        }
        try {
            this.repository.save(new EventDataDb(id, duration0, startedEvent.getType(), startedEvent.getHost(), alert));
            logger.info("mapping to Database Repository action successful");

        } catch (Exception e) {
            logger.error("Exception in database mapping occurred");
            e.printStackTrace();
            return false;

        }
    }
    return true;

}
}
@Repository
 public interface EventDataRepository extends JpaRepository<EventDataDb, String> {
 EventDataDb findAllById(String id);
 }
    @Autowired
       private EventDataRepository repository;

    @Autowired
       private JsonReaderService jReader;
    @Test
    public void whenParseJson_thenTransform_and_save_to_db() throws IOException {
    BufferedReader reader = Files.newBufferedReader(Paths.get("src/main/resources/" + "logfile.txt"));
    List<EventDataJson> eventDataList1 = jReader.readEventDataFromJson(reader);
    if (jReader.mappingToDatabase(eventDataList1)) {
        EventDataDb eventDataFromDb = this.repository.findAllById("scsmbstgra");
        Assertions.assertTrue(eventDataFromDb.getType().equals("APPLICATION_LOG"));
        Assertions.assertTrue(eventDataFromDb.getHost().equals("12345"));
        Assertions.assertTrue(eventDataFromDb.getAlert().equals(true));
        Assertions.assertTrue(eventDataFromDb.getDuration() == 5);
        logger.info("Assert successfully accomplished");
    } else
        logger.error("Could not persist eventData to DB Error");
}

堆栈跟踪

at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)

由:com.creditsuisse.demo.demoapplication.main(demoapplication.java:33)处的java.lang.NullPointerException引起...还有5个`

共有1个答案

唐星晖
2023-03-14

您需要运行springapplication.run(),因为这个方法启动了整个Spring框架。由于代码中没有bean,因此bean不是autowired,并且JsonReaderService是null。您可以在application.java中执行以下操作。此外,由于这涉及到从CLI获取输入,为什么不使用CommandLineRunner如下所示:

@SpringBootApplication
public class DemoApplication 
  implements CommandLineRunner {

    @Autowired
    private JsonReaderService jsonReaderService;

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
 
    @Override
    public void run(String... args) {
        String textFileName = scanFileName();
        Reader reader = Files.newBufferedReader(Paths.get("src/main/resources/" + textFileName));
        List<EventDataJson> jsonReaderServicesList = stat_jsonReaderService.readEventDataFromJson(reader);
        jsonReaderService.mappingToDatabase(jsonReaderServicesList);
    }
}
 类似资料:
  • 问题内容: 我正在将Jenkins管道插件与Jenkinsfile一起使用。 在一个名为vms.git的存储库中,我有Jenkinsfile及其构建的应用程序。 我还有一个名为deploy.git的存储库,其中包含我想用于在vms.git中部署应用程序的脚本。 目前,我的Jenkinsfile看起来像这样 并且我在作业配置中定义了vms.git存储库。 因此,我想做的是检出两个存储库,然后使用vm

  • 我正在使用Jenkins管道插件和Jenkins文件。 在一个名为vms的存储库中。git,我有Jenkinsfile和它构建的应用程序。 我有另一个名为deploy的存储库。git,其中包含我想用于在VM中部署应用程序的脚本。吉特。 目前我的Jenkinsfile就是这样的 我正在作业配置中定义vms.git存储库。 所以我想做的是检查这两个存储库,然后在vms中使用Jenkinsfile。gi

  • 我显然遗漏了一些东西。我正在制作一个简单的应用程序,其中包含并面临以下错误: 我的代码: 应用程序: pom.xml 控制器: 人事服务: 个人服务: PersonRepository(此存储库不能自动连接): 已经在网上搜索了。我什么都没找到。有什么想法吗?

  • 我有一个控制器尝试用可选字段搜索。JPA实体类定义为:

  • 我尝试在本地运行此存储库 我安装了git,但当我运行此命令时: 编辑运行另一个命令时收到此错误:

  • 我想使用Spring LDAP 设置多个 LDAP 存储库。我的目标是同时在所有存储库中创建或更新对象。 我使用LdapRepository Spring接口,我认为目前这是不可能的。 我想知道我是否可以创建自己的LdapRepository来扩展Spring,但是我不知道如何开始。 这是我的配置: 完整地说,一个存储库: 知道怎么做吗? 提前感谢任何帮助。