Java 当服务器准备就绪时,如何在Spring中执行方法?
我有以下问题:我正在为一个基于web的小型私有项目使用SpringBoot,我希望Spring在启动web服务时调用它。“开始”是指“当我的应用程序准备好处理请求时” 我已经尝试实现了,但没有成功,因为事件发生得很早(即,在嵌入式服务器准备好处理请求之前)。此外,中提到的选项也没有解决此问题 我现在的问题是:在服务器完成启动并准备好处理请求后,是否有可能让Spring执行某些操作 编辑(回应Daniel的回答): 问题是我需要一些注入的属性来进行webservice调用,而且由于注入静态值在spring中不起作用,所以这种方法是没有选择的 我的听众,这正是我想要的,只是太早了一点看起来像这样:Java 当服务器准备就绪时,如何在Spring中执行方法?,java,spring,spring-boot,Java,Spring,Spring Boot,我有以下问题:我正在为一个基于web的小型私有项目使用SpringBoot,我希望Spring在启动web服务时调用它。“开始”是指“当我的应用程序准备好处理请求时” 我已经尝试实现了,但没有成功,因为事件发生得很早(即,在嵌入式服务器准备好处理请求之前)。此外,中提到的选项也没有解决此问题 我现在的问题是:在服务器完成启动并准备好处理请求后,是否有可能让Spring执行某些操作 编辑(回应Daniel的回答): 问题是我需要一些注入的属性来进行webservice调用,而且由于注入静态值在sp
@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);
}
}
第二次编辑:
尽管这个问题解决了一个非常类似的问题,但我似乎无法将其注入到对象中,因为它需要具有以下形式的构造函数(org.springframework.boot.SpringApplication,[Ljava.lang.String;)
另外,不必创建spring.factories文件,只需使用注释即可解决此问题。如果我了解您的问题所在,您可以在应用程序启动后立即调用主应用程序上的Web服务
public static void main(String[] args) {
new SpringApplication(Application.class).run(args);
//call the webservice for you to handle...
}
我不确定这是否是您想要的…在您的组件中,您可以使用
@PostConstruct
注释
@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被初始化并发生自动连接,就会触发此操作。@Component
@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);
}
}}
公共类启动实现ApplicationListener{
私人网络客户端网络客户端;
@凌驾
ApplicationEvent上的公共无效(WebServerInitializedEvent事件){
字符串baseUrl=”http://url.com"
webClient=webClient.create(baseUrl);
ExecuterTestCall(baseUrl+“/info”);
}
void executestcall(字符串uri){
试一试{
webClient.get()
.uri(uri)
.exchange()
.block();
}捕获(例外e){
错误(“请求url-{}”,uri,e失败);
}
}}
Hmm,您的应用程序是否使用Spring MVC作为其web部件或其他框架,或者根本不使用框架?我使用WebMVC和Vaadin作为UI框架。问题的可能重复之处在于,我需要一些注入属性来进行webservice调用,而静态注入就我所知并不真正起作用。您能否提供一个示例?从spring文档中,您可以执行如下请求:publicstaticvoidmain(字符串args[]){RestTemplate RestTemplate=new RestTemplate();Page Page=RestTemplate.getForObject(“”,Page.class”);System.out.println(“名称:”+Page.getName());System.out.println(“关于:”+page.getAbout();System.out.println(“电话:+page.getPhone());System.out.println(“网站:+page.getWebsite());}请查看我的编辑(不幸的是,无法硬连接所有变量)不幸的是,这不起作用,因为调用此方法时应用程序未完全启动。您能解释一下“未完全启动”是什么意思吗?完全启动意味着(如问题中所述)服务器已准备好处理请求。因为应用程序将从Web服务回调。