我有一个Spring应用程序,其中我创建了一个POST方法,期望用户通过输入一些信息。一旦获取输入,我将生成一个表示最终URL的字符串。然后,我想在包含CommandLineRunner的Configuration中传递这个字符串URL。
问题是CommandLineRunner在应用程序启动时被执行,这意味着我的输入有空值,因此抛出了null指针异常。是否有可能在应用程序启动后为我的CommandLineRunner添加数据,而不知何故,后者的执行变得平滑?
REST控制器类
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;
}
}配置类
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类
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
<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>发布于 2022-10-20 18:04:06
这个问题有点奇怪。正如您所说的,当我们使用命令行运行应用程序(因此称为CommandLineRunner)时调用这个功能接口,那时我们可以从命令提示符中给出一些类似于java -jar MyApp "param1" "param2"的参数。param1和param2作为params传递给主方法。因此,它只被称为一次。
CommandLineRunner是一个带有run方法的简单Spring接口。Spring将在应用程序上下文为已加载之后自动调用实现此接口的所有been的run方法。
PS:如果您想在方法完成后调用您的业务逻辑,您可以使用Spring。如果您有另一个场景,比如在另一个线程中执行一个方法,可以使用ExecutorServices类来达到它,或者您可以自己实现它。
https://stackoverflow.com/questions/74142203
复制相似问题