升级到 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 函数进行更复杂的转换,则可能不是最好的方法。
我有以下 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 函数进行更复杂的转换,则可能不是最好的方法。