升级到Mule Runtime 3.8.1后MEL功能的意外行为

时间:2017-11-06 15:56:05

标签: mule dataweave mule-el mvel

我有以下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$$216b1542.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现在被视为参数,但我不知道为什么。

1 个答案:

答案 0 :(得分:1)

官方文件对全球MEL函数的使用是简洁的,并且没有提到变量声明,例如String fooWithoutHyphens = ...。相关文档可在MEL DocsDataWeave docs上找到3.8。

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