Создание bean-компонента RoutingFunction в последней версии Spring Boot и Spring Cloud.

В моем проекте я использовал функцию весеннего облака. Мы использовали Spring Boot версии 2.6.6 и Spring-cloud-function-context версии 3.2.3 вместе с другими необходимыми зависимостями. При этом я использовал RoutingFunction (org.springframework.cloud.function.context.config) для пользовательской маршрутизации. . Я не создавал ни одного bean-компонента для RoutingFunction, и он работал нормально.

      @Component
@Slf4j
public class FxRouter<T> implements UnaryOperator<Message<T>> {

  private RoutingFunction routingFunction;

  @Autowired
  public FxRouter(RoutingFunction routingFunction) {
    this.routingFunction = routingFunction;
  }

  @Override
  public Message<T> apply(Message<T> object) {
    log.debug("In FxRouter, received object : {}", object);
    String springCloudFunctions = System.getenv(Constants.SPRING_CLOUD_FUNCTION_ORDER);
    log.debug("Execution sequence order : {}", springCloudFunctions);
    if (DMUtil.isNotBlank(springCloudFunctions)) {
      return startRouting(object,springCloudFunctions);
    } else {
      log.error("No Spring Cloud Function Order Property provided in Environment variable");
      return null;
    }
  }
    private Message<T> startRouting(Message<T> object,String springCloudFunctions) {
    log.debug("In FxRouter-startRouting, received object for routing : {}", object);
    T incomingAWSEvent = object.getPayload();
    List<String> functions =
      Arrays.asList(springCloudFunctions.split(Pattern.quote(Constants.FUNCTION_PIPE)));
    Iterator<String> functionsItr = functions.iterator();
    while (functionsItr.hasNext()) {
      String function = functionsItr.next();
      try {
        Message<T> functionMessage = MessageBuilder
          .withPayload(object.getPayload())
          .setHeader(Constants.SPRING_CLOUD_FUNCTION_DEFINITION, function)
          .setHeader(MessageHeaders.CONTENT_TYPE, Constants.CONTENT_TYPE_TEXT_PLAIN)
          .copyHeadersIfAbsent(object.getHeaders())
          .build();
        log.debug("Routing to function: {} ", function);
        Object payload = routingFunction.apply(functionMessage);
        object = getPayloadMessage(object, payload);
        if (!functionsItr.hasNext()) {
          return object;
        }
      } catch (CustomRuntimeException e) {
        Message<CustomRuntimeException> errorMessage = MessageBuilder
          .withPayload(e)
          .setHeader(Constants.SPRING_CLOUD_FUNCTION_DEFINITION, Constants.LOGGER_FUNCTION)
          .build();
        Message<T> message = routeToErrorHandlerOrReturnResponse(incomingAWSEvent, e, errorMessage);
        if (message != null) {
          return message;
        }
        break;
      }
    }
    return null;
  }

Недавно я обновил версию весенней загрузки до 3.1.2 и использую версию зависимости Spring Cloud ниже.

      <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2022.0.4</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
      <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-function-context</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-function-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-function-adapter-aws</artifactId>
        </dependency>

Сейчас после обновления до последней версии. Я не могу выполнить автоматическое подключение RoutingFunction, потому что оно говорит: « Не удалось выполнить автоматическое подключение». Компоненты типа RoutingFunction не найдены . Поэтому я пытаюсь создать компонент для RoutingFunction, как показано ниже.

      @Configuration(proxyBeanMethods = false)
public class RouterConfig {

  @Bean
  public RoutingFunction routingFunction() {
    return new RoutingFunction(null,null);
  }
}

Но тогда я получаю ошибку во время выполнения

       "stackTrace": "java.lang.NullPointerException\n\tat org.springframework.cloud.function.context.config.RoutingFunction.resolveFunction(RoutingFunction.java:237)\n\tat org.springframework.cloud.function.context.config.RoutingFunction.functionFromDefinition(RoutingFunction.java:206)\n\tat org.springframework.cloud.function.context.config.RoutingFunction.route(RoutingFunction.java:137)\n\tat org.springframework.cloud.function.context.config.RoutingFunction.apply(RoutingFunction.java:107)\n\tat 

Может ли кто-нибудь помочь мне, как создать bean-компонент для RoutingFunction?

0 ответов

Другие вопросы по тегам