Я пытаюсь преобразовать свое приложение SpringBoot в функциональную форму регистрации bean-компонента для ускорения времени запуска приложения, как указано в документации Spring для Spring Cloud Functions. Ниже приведен код, указанный в документации:
@SpringBootConfiguration
public class DemoApplication implements ApplicationContextInitializer<GenericApplicationContext> {
public static void main(String[] args) {
FunctionalSpringApplication.run(DemoApplication.class, args);
}
public Function<String, String> uppercase() {
return value -> value.toUpperCase();
}
@Override
public void initialize(GenericApplicationContext context) {
context.registerBean("demo", FunctionRegistration.class,
() -> new FunctionRegistration<>(uppercase())
.type(FunctionType.from(String.class).to(String.class)));
}
}
Вот мой код, который пытается следовать приведенному выше примеру. Основное отличие состоит в том, что моя функция - это отдельный класс, который реализует интерфейс функции Java 8.
import com.example.functions.RockPaperScissors;
import com.example.model.Game;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.cloud.function.context.FunctionRegistration;
import org.springframework.cloud.function.context.FunctionType;
import org.springframework.cloud.function.context.FunctionalSpringApplication;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.support.GenericApplicationContext;
@Slf4j
@ComponentScan
@SpringBootConfiguration
public class Application implements ApplicationContextInitializer<GenericApplicationContext> {
private RockPaperScissors rockPaperScissors;
public static void main(String[] args) {
FunctionalSpringApplication.run(Application.class, args);
}
@Override
public void initialize(GenericApplicationContext applicationContext) {
applicationContext.registerBean(
"rpsFunction",
FunctionRegistration.class,
() ->
new FunctionRegistration<>(this.rockPaperScissors)
.type(FunctionType.from(Game.class).to(String.class)));
}
@Autowired
public void setRpsFunction(RockPaperScissors rockPaperScissors) {
this.rockPaperScissors = rockPaperScissors;
}
}
У меня проблема: java .lang.IllegalArgumentException: 'target' не должен быть нулевым. Я знаю, что это связано с отсутствием контекста приложения, но не уверен, почему FunctionalSpringApplication.run(DemoApplication.class, args);
не создает этот контекст.