WSO2 EI中Call Mediator动态URL引发MalformedUriTemplateException问题
问题解决:WSO2 EI中Call Mediator URI模板使用get-property报错
错误原因
你遇到的com.damnhandy.uri.template.MalformedUriTemplateException是因为URI模板的变量语法不支持直接嵌套get-property()函数调用。URI模板里的{}只能包含简单的变量名,不能带函数或特殊字符(比如括号、单引号),解析器会把get-property('default当成变量名,识别到无效字符后触发报错。
修复方案
两种常用修复方式,任选其一即可:
方案1:直接引用预定义的URL变量(推荐)
既然你已经通过tokenRequestUrl生成了完整请求地址,直接在URI模板里引用这个变量名即可,不需要嵌套函数:
<iterate expression="json-eval($)"> <target> <sequence> <log level="custom"> <property expression="json-eval($.tokenEndpoint)" name="tokenEndpoint"/> </log> <!-- Extract API Credentials --> <property expression="json-eval($.tokenEndpoint)" name="TokenEndpoint" scope="default" type="STRING"/> <property expression="json-eval($.client_id)" name="client_id" scope="default" type="STRING"/> <property expression="json-eval($.client_secret)" name="client_secret" scope="default" type="STRING"/> <property expression="concat(get-property('TokenEndpoint'), '?client_id=', get-property('client_id'), '&client_secret=', get-property('client_secret'))" name="tokenRequestUrl" scope="default" type="STRING"/> <log level="full"> <property expression="get-property('tokenRequestUrl')" name="Final Token Request URL"/> </log> <!-- Call API - 直接引用变量名 --> <call> <endpoint> <http method="GET" uri-template="{tokenRequestUrl}"> <suspendOnFailure> <initialDuration>-1</initialDuration> <progressionFactor>-1</progressionFactor> <maximumDuration>0</maximumDuration> </suspendOnFailure> <markForSuspension> <retriesBeforeSuspension>0</retriesBeforeSuspension> </markForSuspension> </http> </endpoint> </call> </sequence> </target> </iterate>
方案2:使用TRANSPORT_URL属性指定地址
通过设置axis2作用域的TRANSPORT_URL属性,直接指定请求地址,无需URI模板:
<iterate expression="json-eval($)"> <target> <sequence> <log level="custom"> <property expression="json-eval($.tokenEndpoint)" name="tokenEndpoint"/> </log> <!-- Extract API Credentials --> <property expression="json-eval($.tokenEndpoint)" name="TokenEndpoint" scope="default" type="STRING"/> <property expression="json-eval($.client_id)" name="client_id" scope="default" type="STRING"/> <property expression="json-eval($.client_secret)" name="client_secret" scope="default" type="STRING"/> <property expression="concat(get-property('TokenEndpoint'), '?client_id=', get-property('client_id'), '&client_secret=', get-property('client_secret'))" name="tokenRequestUrl" scope="default" type="STRING"/> <log level="full"> <property expression="get-property('tokenRequestUrl')" name="Final Token Request URL"/> </log> <!-- 设置TRANSPORT_URL --> <property name="TRANSPORT_URL" expression="get-property('tokenRequestUrl')" scope="axis2"/> <!-- Call API --> <call> <endpoint> <http method="GET"> <suspendOnFailure> <initialDuration>-1</initialDuration> <progressionFactor>-1</progressionFactor> <maximumDuration>0</maximumDuration> </suspendOnFailure> <markForSuspension> <retriesBeforeSuspension>0</retriesBeforeSuspension> </markForSuspension> </http> </endpoint> </call> </sequence> </target> </iterate>
额外提示
多数OAuth2令牌请求要求使用POST方法并传递表单参数,而非GET方式的URL参数。如果你的场景符合这种情况,需要调整method为POST,并添加表单参数处理逻辑。
内容的提问来源于stack exchange,提问作者Roy
相关产品推荐
相关产品推荐

