我有以下问题:我正在使用Spring-Boot进行一个基于Web的私有项目,我希望Spring在启动时调用Web服务。开始时我的意思是“当我的应用程序准备好处理请求时”。
我已尝试实施ApplicationListener< ContextRefreshedEvent>但它没有工作,因为事件发生在早期(即嵌入式服务器准备好处理请求之前)。 this question中提到的选项也没有解决这个问题。
我现在的问题是:在服务器完成启动并准备好处理请求后,是否有可能告诉Spring执行某些操作?
编辑(回应丹尼尔的回答):问题是我需要一些注入的属性来进行webservice调用,并且因为注入静态值在spring中不起作用,所以这种方法是没有选择的。
我的听众,做我想做的事,有点太早看起来像这样:
@Component
public class StartupListener implements ApplicationListener{
@Autowired
private URLProvider urlProvider;
@Value("${server.port}")
private int port;
@Value("${project.name}")
private String projectName;
@Override
public final void onApplicationEvent(ContextRefreshedEvent event) {
RestTemplate template = new RestTemplate();
String url = uriProvider.getWebserviceUrl(this.projectName);
template.put(url, null);
}
}
第二次编辑:
虽然this问题解决了一个非常类似的问题,但似乎我无法注入到对象中,因为它需要有一个表单的构造函数(org.springframework.boot.SpringApplication,[Ljava。 lang.String;)
在不必创建spring.factories文件但使用注释的情况下解决它也是绝望的。
答案 0 :(得分:1)
如果我了解您的问题,您可以在应用程序主服务器启动后立即调用该服务器上的Web服务。
public static void main(String[] args) {
new SpringApplication(Application.class).run(args);
//call the webservice for you to handle...
}
我不确定这是不是你想要的......
答案 1 :(得分:0)
在您的组件中,您可以使用@PostConstruct
注释。 e.g。
@Component
public class StartupListener {
@Autowired
private URLProvider urlProvider;
@Value("${server.port}")
private int port;
@Value("${project.name}")
private String projectName;
@PostConstruct
public final void init() {
RestTemplate template = new RestTemplate();
String url = uriProvider.getWebserviceUrl(this.projectName);
template.put(url, null);
}
}
一旦bean初始化并自动装配,就会触发。
答案 2 :(得分:0)
@Component
public class StartUp implements ApplicationListener<WebServerInitializedEvent> {
private WebClient webClient;
@Override
public void onApplicationEvent(WebServerInitializedEvent event) {
String baseUrl = "http://url.com"
webClient = WebClient.create(baseUrl);
executeRestCall(baseUrl+"/info");
}
void executeRestCall(String uri) {
try {
webClient.get()
.uri(uri)
.exchange()
.block();
} catch (Exception e) {
log.error("Request failed for url - {}",uri, e);
}
}}