我有以下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现在被视为参数,但我不知道为什么。
答案 0 :(得分:1)
官方文件对全球MEL函数的使用是简洁的,并且没有提到变量声明,例如String fooWithoutHyphens = ...
。相关文档可在MEL Docs和DataWeave docs上找到3.8。
即使你的例子适用于Mule 3.7,也不能保证它会在以后的版本中继续工作,因为它没有记录。我认为你的例子中使用的工作可能是一个很好的方法,或者如果你需要使用全局MEL功能进行更复杂的转换,可能不是最好的方法。