Как настроить контекст приложения с помощью регистрации бинов в функциональном стиле - PullRequest
1 голос
/ 09 марта 2020

Я пытаюсь преобразовать свое приложение 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); не создает этот контекст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...