在APIKit前设置安全属性时遇SerializableLazyValue反射错误,求解决
问题背景
需要在APIKit前置流程中修改请求属性,添加一个从安全配置中读取的Header值,原使用DataWeave代码尝试直接拼接并强制转换为HttpRequestAttributes类型,代码如下:
%dw 2.0 output application/java --- ( (attributes - "headers" - "maskedRequestPath") ++ ({ headers: attributes.headers ++ { xpto: p("secure::SOME-VALUE") } }) ) as Object { class: "org.mule.extension.http.api.HttpRequestAttributes" }
执行后出现以下异常:
"Exception happen while calling 'class
org.mule.extension.http.api.HttpRequestAttributesBuilder.build()'
method. Reason: Errors while creating
org.mule.runtime.api.util.SerializableLazyValue by reflection, even
when class in on classpath.'5| (attributes | ... 19| }
Trace: at main (line: 5, column: 5)" evaluating expression: "%dw 2.0
output application/java --- ( (attributes - "headers" -
"maskedRequestPath") ++ ({ headers: attributes.headers ++ { xpto:
p("secure::SOME-VALUE") } }) ) as Object { class:
"org.mule.extension.http.api.HttpRequestAttributes" }".
解决方案
直接通过DataWeave强制类型转换无法正确初始化HttpRequestAttributes内部的序列化依赖组件,应该使用官方提供的HttpRequestAttributesBuilder工具类来构建修改后的属性实例,推荐使用Groovy脚本实现:
import org.mule.extension.http.api.HttpRequestAttributesBuilder // 从原属性创建构建器 def attributeBuilder = HttpRequestAttributesBuilder.from(attributes) // 复制原Header并添加新值 def updatedHeaders = new HashMap<>(attributes.headers) updatedHeaders.put("xpto", p("secure::SOME-VALUE")) // 更新构建器的Header attributeBuilder.headers(updatedHeaders) // 构建并返回新的属性实例 return attributeBuilder.build()
原理说明
HttpRequestAttributesBuilder是Mule官方提供的专门用于创建和修改HttpRequestAttributes的工具,它会正确处理内部的SerializableLazyValue等组件的初始化,避免反射创建实例时的序列化异常,同时保证属性实例的完整性和正确性。
内容的提问来源于stack exchange,提问作者mhery

