升级到 Mule Runtime 3.8.1 后 MEL 函数的意外行为

Unexpected behaviour of MEL function after upgrade to Mule Runtime 3.8.1

我有以下 MEL 功能:

def createSomething(foo){
    if (org.springframework.util.StringUtils.isEmpty(foo)){
        return org.apache.commons.lang.StringUtils.remove(java.util.UUID.randomUUID().toString(), '-');
    }
    if (foo.toString().length() <= 32){
        return foo;
    }
    String fooWithoutHyphens = org.apache.commons.lang.StringUtils.remove(foo.toString(), '-');
    if (fooWithoutHyphens.length() <= 32){
        return fooWithoutHyphens;
    }
    return foo.toString().substring(0, 32);
}

正在从 DWL 文件调用:

%var mySomething = createSomething("foo")

这在 Mule Runtime 3.7.2 上运行良好。

然而,在升级到 Mule Runtime 3.8.1 后,我收到以下异常:

com.mulesoft.weave.mule.exception.WeaveExecutionException: Exception while executing: 
Unknown
Not enough arguments (1) for function with parameters (foo, 

fooWithoutHyphens)..
    at com.mulesoft.weave.mule.exception.WeaveExecutionException$.apply(WeaveExecutionException.scala:12)
    at com.mulesoft.weave.mule.WeaveMessageProcessor.execute(WeaveMessageProcessor.scala:121)
    at com.mulesoft.weave.mule.WeaveMessageProcessor.process(WeaveMessageProcessor.scala:67)
    at com.mulesoft.weave.mule.WeaveMessageProcessor$$FastClassByCGLIB$6b1542.invoke(<generated>)

当我提供任何东西作为函数的第二个参数时,例如

%var mySomething = createSomething("foo", 0)

没有发生异常,尽管据我所知函数没有按预期工作。

这种行为的原因是什么?如何解决?

更新:如果以下部分:

String fooWithoutHyphens = org.apache.commons.lang.StringUtils.remove(foo.toString(), '-');
if (fooWithoutHyphens.length() <= 32){
    return fooWithoutHyphens;
}

被删除或替换为:

  if (org.apache.commons.lang.StringUtils.remove(foo.toString(), '-').length() <= 32){
        return org.apache.commons.lang.StringUtils.remove(foo.toString(), '-');
    }

没有抛出异常。似乎声明的字符串 fooWithoutHyphens 现在被当作一个参数,但我不知道为什么。

官方文档对全局MEL函数的使用简洁明了,并没有提及String fooWithoutHyphens = ...等变量声明。可以在 MEL Docs and DataWeave docs for 3.8.

上找到相关文档

即使您的示例在 Mule 3.7 上运行,也不能保证它会继续在以后的版本上运行,因为它没有记录。我认为您在示例中使用的工作可能是一个很好的方法,或者如果您需要使用全局 MEL 函数进行更复杂的转换,则可能不是最好的方法。