Mule 3.9使用Session变量设置HashMap类型Payload遇异常求解决
解决Mule 3.9中Session变量构建HashMap Payload的类型问题
我在Mule 3.9开发时也遇到过一模一样的情况,硬编码Map能正常生成java.util.HashMap,但用Session变量就变成字符串类型,给你几个亲测有效的解决办法:
方法1:用DataWeave 1.0显式生成HashMap
Mule 3.9默认使用DataWeave 1.0,你可以通过DataWeave脚本强制输出Java HashMap类型,示例如下:
<dw:transform-message doc:name="Transform Message"> <dw:set-payload><![CDATA[%dw 1.0 %output application/java --- { Test: sessionVars.transactionAmount }]]></dw:set-payload> </dw:transform-message>
这里%output application/java会明确告诉Mule把DataWeave生成的Map转换成java.util.HashMap类型,完美解决类型不匹配的问题。
方法2:用MEL表达式直接实例化HashMap
如果不想用DataWeave,也可以通过MEL表达式直接创建HashMap对象并赋值:
<set-payload value="#[new java.util.HashMap(['Test': sessionVars.transactionAmount])]" doc:name="Set Payload"/>
这种方式直接在MEL里实例化HashMap,把Session变量作为值传入,生成的Payload就是标准的java.util.HashMap类型。
额外检查点:确认Session变量的类型
还要注意提取URI参数到Session变量时的类型——如果transactionAmount被存成了String类型(URI参数默认是字符串格式),即使Map类型正确,值还是String。如果需要数值类型,可以在存储Session变量时做类型转换,比如:
<set-session-variable variableName="transactionAmount" value="#[java.lang.Double.parseDouble(message.inboundProperties.'http.query.params'.transactionAmount)]" doc:name="Set Session Variable"/>
问题根源
之所以直接引用Session变量会生成String,是因为Mule会把类似{Test=[sessionVars.transactionAmount]}这样的写法当成字符串字面量解析,而不是识别为Map结构,所以必须通过显式的类型声明(DataWeave输出设置)或直接实例化对象来确保生成的是HashMap。
内容的提问来源于stack exchange,提问作者Anand Singh
相关产品推荐
相关产品推荐

