java - 如何使用spring集成dsl在子流路由中转换字符串
问题描述
我编写了一个非常简单的示例,使用 spring 中的 route 与 transform 集成,但它给出了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)
解决方案
当我们回退到 SpEL 调用时,它看起来像一个错误,它只是找不到具有预期参数类型的方法来调用。请针对Spring Integration提出问题。即使是普通的 Java,我们也有同样的问题,不仅仅是 Kotlin。
作为一种解决方法,我建议使用 afilter()
而不是,transform()
因为 a PayloadMethodArgumentResolver
for an默认情况下InvocableHandlerMethod
不允许空有效负载:
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
推荐阅读
- django - Django 使用用于跟踪状态更改的单个 DateField 查询模型
- python - office2john,只读模式
- python - Pandas 过滤并创建新列
- python - 在 python 中使用 array.sort() 方法对二维数组进行排序的时间复杂度是多少?
- plugins - 如何实现 DrRacket 插件之间的简单依赖?
- date - Power Bi 日期未翻译
- swift - 在 Swift 包中使用 CoreData 和 SwiftUI 预览时出现问题
- opengl - 实例渲染的最佳实践是什么?
- django - 将 create_or_get 与 DRF 一起使用的正确方法
- android - 在打开活动喷气背包组合时创建具有延迟和持续时间的动画图像