Как преобразовать String в маршрут subflow с помощью пружинной интеграции dsl - PullRequest
0 голосов
/ 06 октября 2019

Я кодировал очень простой пример использования весенней интеграции маршрута с преобразованием, но дает ли он SpelEvaluationException.

Кодовый шлюз:

@MessagingGateway
@Component
interface ApiGateway {

  @Gateway(requestChannel = "integrateAttributeChannel")
  fun integrateAttributes(message: String)

}

Мой поток:

IntegrationFlows
            .from("integrateAttributeChannel")
            .route<String, Boolean>({ sellerId -> sellerId.isBlank() },
                    { m ->
                        m.subFlowMapping(true) { sf ->
                            sf.transform<String, String> { t -> t.toUpperCase() }
                        }
                        m.subFlowMapping(false) { sf ->
                            sf.transform<String, String> { t -> t.reversed() }
                        }
                    })
            .handle { t -> println(t) }
            .get()

Трассировка исключения:

Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1004E: Method call: Method transform(java.lang.String) cannot be found on type br.com.gubee.config.AttributeFlow$flow$2$2$1
    at org.springframework.expression.spel.ast.MethodReference.findAccessorForMethod(MethodReference.java:225)
    at org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:134)
    at org.springframework.expression.spel.ast.MethodReference.access$000(MethodReference.java:54)
    at org.springframework.expression.spel.ast.MethodReference$MethodValueRef.getValue(MethodReference.java:390)
    at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:90)
    at org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:114)
    at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:365)
    at org.springframework.integration.util.AbstractExpressionEvaluator.evaluateExpression(AbstractExpressionEvaluator.java:172)
    at org.springframework.integration.util.AbstractExpressionEvaluator.evaluateExpression(AbstractExpressionEvaluator.java:160)
    at org.springframework.integration.handler.support.MessagingMethodInvokerHelper.invokeExpression(MessagingMethodInvokerHelper.java:664)
    at org.springframework.integration.handler.support.MessagingMethodInvokerHelper.invokeHandlerMethod(MessagingMethodInvokerHelper.java:655)
    at org.springframework.integration.handler.support.MessagingMethodInvokerHelper.processInternal(MessagingMethodInvokerHelper.java:491)
    at org.springframework.integration.handler.support.MessagingMethodInvokerHelper.process(MessagingMethodInvokerHelper.java:362)
    at org.springframework.integration.handler.MethodInvokingMessageProcessor.processMessage(MethodInvokingMessageProcessor.java:106)
    at org.springframework.integration.transformer.AbstractMessageProcessingTransformer.transform(AbstractMessageProcessingTransformer.java:113)
    at org.springframework.integration.transformer.MessageTransformingHandler.handleRequestMessage(MessageTransformingHandler.java:109)
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:123)
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:162)
    at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:115)

1 Ответ

1 голос
/ 15 октября 2019

Это выглядит как ошибка, когда мы выполняем откат к вызову SpEL, и он просто не может найти метод с ожидаемым типом аргумента для вызова. Пожалуйста, поднимите вопрос против Spring Integration . У нас такая же проблема даже с обычной Java, а не только с Kotlin.

В качестве обходного пути я бы предложил использовать filter() вместо transform(), поскольку PayloadMethodArgumentResolver для InvocableHandlerMethod не делаетt разрешить пустую полезную нагрузку по умолчанию:

if (isEmptyPayload(payload)) {
        if (ann == null || ann.required()) {
            String paramName = getParameterName(parameter);
            BindingResult bindingResult = new BeanPropertyBindingResult(payload, paramName);
            bindingResult.addError(new ObjectError(paramName, "Payload value must not be empty"));
            throw new MethodArgumentNotValidException(message, parameter, bindingResult);
        }

ОБНОВЛЕНИЕ

Я продолжил и создал проблему: https://github.com/spring-projects/spring-integration/issues/3079

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