我正在尝试开发调度休息客户端。 任务是:
我创建了 Spring boot 应用程序:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class IntegrationApplication {
public static void main(String[] args) throws IOException {
SpringApplication.run(IntegrationApplication.class, args);
}
}
我创建了调度程序配置:
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@Configuration
@EnableScheduling
@EnableAsync
@ConditionalOnProperty(name = "scheduler.enabled", matchIfMissing = true)
public class SchedulerConfig { }
我创建了向 REST API 发送请求的 Java 类:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Service
public class GetAllData {
@Value("${server.url}")
private String serverUrl;
@Value("${security.oauth2.client.clientSecret}")
private String clientSecret;
private static RestClientGetExecute restClientGetExecute;
public void get() {
// Do send request
}
}
最后,我创建了 java 类来启动请求发送,正如我所期望的:
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.ZonedDateTime;
@Component
public class TestEngine {
private static GetAllData getAllData;
@Scheduled(fixedDelay = 2000)
public void getLocalDateTimeFixedDelay() throws InterruptedException {
getAllData.get();
}
}
但这不起作用。错误是:
java.lang.NullPointerException: Cannot invoke GetAllData.get()" because "TestEngine.getAllData" is null
您能帮我了解如何运行计划向 REST API 发送请求吗?
问题是你的
TestEngine
Spring 没有任何东西可以确定它需要自动装配什么。字段或具有依赖关系的单个构造函数上没有 @Autowired
。除此之外,即使有 @Autowired
它也不起作用,因为无法注入 static
字段。
将您的
TestEngine
更改为类似这样的内容。将字段更改为 final
而不是 static
,并添加一个采用依赖项的构造函数。
Component
public class TestEngine {
private final GetAllData getAllData;
public TestEngine(GetAllData getAllData) {
this.getAllData=getAllData;
}
@Scheduled(fixedDelay = 2000)
public void getLocalDateTimeFixedDelay() throws InterruptedException {
getAllData.get();
}
}
这显然适用于
static
中的 GetAllData
字段以及也有 static
字段。
@Service
public class GetAllData {
@Value("${server.url}")
private String serverUrl;
@Value("${security.oauth2.client.clientSecret}")
private String clientSecret;
private final RestClientGetExecute restClientGetExecute;
public GetAllData(RestClientGetExecute restClientGetExecute) {
this.restClientGetExecute=restClientGetExecute;
}
public void get() {
// Do send request
}
}
如果在其他地方使用
static
作为应注入的依赖项,请将它们切换为构造函数参数。