首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Spring应用程序输入数据后调用CommandLineRunner

问如何在Spring应用程序输入数据后调用CommandLineRunner
EN

Stack Overflow用户
提问于 2022-10-20 15:07:52
回答 1查看 83关注 0票数 2

我有一个Spring应用程序,其中我创建了一个POST方法,期望用户通过输入一些信息。一旦获取输入,我将生成一个表示最终URL的字符串。然后,我想在包含CommandLineRunner的Configuration中传递这个字符串URL。

问题是CommandLineRunner在应用程序启动时被执行,这意味着我的输入有空值,因此抛出了null指针异常。是否有可能在应用程序启动后为我的CommandLineRunner添加数据,而不知何故,后者的执行变得平滑?

REST控制器类

代码语言:javascript
复制
package com.andrekreou.covid.gov.controller;

import com.andrekreou.covid.gov.model.Covid;
import com.andrekreou.covid.gov.model.Date;
import com.andrekreou.covid.gov.service.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class Controller {

    private final Service service;

    @Autowired
    public Controller(Service service) {
        this.service = service;
    }

    @GetMapping(path = "/covid")
    public List<List<Covid>> getData(){
        return service.getData();
    }

    @PostMapping(value = "/insert/date")
    public String insertDate(@ModelAttribute("date") Date date) {
        String inserted_date = date.getDate();
        return "https://data.gov.gr/api/v1/query/mdg_emvolio?date_from=" + inserted_date + "&date_to=" + inserted_date;
    }
}

配置类

代码语言:javascript
复制
package com.andrekreou.covid.gov.configuration;

import com.andrekreou.covid.gov.controller.Controller;
import com.andrekreou.covid.gov.model.Covid;
import com.andrekreou.covid.gov.model.Date;
import com.andrekreou.covid.gov.repository.CovidRepo;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;

import java.util.Collections;
import java.util.List;

@Configuration
public class CovidConfig {

    Controller controller;

    Date date;

    @Bean
    CommandLineRunner commandLineRunner(CovidRepo covidRepo){
        return args -> {

            String url = controller.insertDate(date);
            RestTemplate restTemplate = new RestTemplate();

            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
            headers.set("Authorization","Token 8329eb4fa30e567d9e3f6bfed266c8cb4c9c94ad");

            HttpEntity<Object> request = new HttpEntity<>(headers);

            ResponseEntity<List<Covid>> postEntity = restTemplate.exchange(
                    url,
                    HttpMethod.GET,
                    request,
                    new ParameterizedTypeReference<>() {
                    });

            List<Covid> covidList = postEntity.getBody();
            assert covidList != null;
            covidRepo.saveAll(covidList);
            System.out.println(covidList);
        };
    }
}

POJO类

代码语言:javascript
复制
package com.andrekreou.covid.gov.model;

public class Date {

    private String date;

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }
}

HTML

代码语言:javascript
复制
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="description" content="">
    <meta name="author" content="">
    <title>login</title>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" rel="stylesheet"
          integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous">
    <link href="https://getbootstrap.com/docs/4.0/examples/signin/signin.css" rel="stylesheet" crossorigin="anonymous">
    <style>
        body {
            background-color: #3e3e3e;
            color: white;
        }
        h2 {
            text-align: center;
        }
    </style>
</head>

<body>
<div class="container">
    <form class="date" name="date" method="post" action="/insert/date" enctype="application/x-www-form-urlencoded">
        <h2 class="form-register-heading">Please Enter Date</h2>
        <p>
            <label for="date" class="sr-only">Date</label>
            <input type="text" id="date" name="date" class="date" placeholder="date" required=""
                   autofocus="">
        </p>
        <button class="btn btn-lg btn-primary btn-block" type="submit">Insert Date</button>
    </form>
</div>
</body>
</html>
EN

回答 1

Stack Overflow用户

发布于 2022-10-20 18:04:06

这个问题有点奇怪。正如您所说的,当我们使用命令行运行应用程序(因此称为CommandLineRunner)时调用这个功能接口,那时我们可以从命令提示符中给出一些类似于java -jar MyApp "param1" "param2"的参数。param1和param2作为params传递给主方法。因此,它只被称为一次。

CommandLineRunner是一个带有run方法的简单Spring接口。Spring将在应用程序上下文为已加载之后自动调用实现此接口的所有been的run方法。

PS:如果您想在方法完成后调用您的业务逻辑,您可以使用Spring。如果您有另一个场景,比如在另一个线程中执行一个方法,可以使用ExecutorServices类来达到它,或者您可以自己实现它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74142203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档