You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WSO2 EI经Endpoint调用数据服务报找不到firstName参数错误

问题定位

这是配置错误叠加参数映射规则不匹配导致的问题,核心原因是WSO2数据服务层没有从请求中提取到firstName参数,从错误日志中Current Params: {}可以确认,请求到达数据服务时参数集合为空。Postman直接调用能成功是手动构造请求时恰好适配了错误配置的偶然结果,集成流程中的配置存在三处明确问题:

  • 数据服务参数绑定类型错误:资源路径customer/{firstName}中的{firstName}是URI路径占位符(路径参数),但配置中使用query-param类型绑定参数,该类型只会从URL查询字符串(?key=value格式)中提取参数,不会解析路径段中的占位符,自然拿不到值。
  • HTTP方法使用不规范:数据插入属于写操作,错误使用GET方法,WSO2数据服务对GET请求的参数处理逻辑存在默认限制,非查询类操作使用GET容易出现参数透传异常。
  • 入参提取存在潜在风险:API层使用json-eval($.name.first_name)提取请求参数,如果传入的JSON结构和表达式不匹配,uri.var.firstName属性会被赋值为空,直接导致后续路径拼接错误。
修复方案

按以下顺序调整配置,重新部署CAR包即可修复:

  1. 修正数据服务的参数绑定规则,将路径参数的绑定类型从query-param改为path-param,同时将资源请求方法改为POST适配写操作场景,修改后的数据服务配置如下:
<data name="CustomerDataService" serviceNamespace="" serviceGroup="" transports="">
  <description />
  <config id="CustomerDatasource">
    <property name="driverClassName">com.mysql.cj.jdbc.Driver</property>
    <property name="url">jdbc:mysql://localhost:3306/demopresentation</property>
    <property name="username">root</property>
    <property name="password" />
  </config>
  <query id="CreateCustomerEntry" useConfig="CustomerDatasource">
    <sql>insert into customers (FirstName) values (:firstName)</sql>
    <param name="firstName" paramType="SCALAR" sqlType="STRING" type="IN" />
  </query>
   <resource path="customer/{firstName}" method="POST">
      <call-query href="CreateCustomerEntry">
         <with-param name="firstName" path-param="firstName" />
      </call-query>
   </resource>
</data>
  1. 同步修改Endpoint的请求方法,和数据服务资源方法保持一致:
<?xml version="1.0" encoding="UTF-8"?>
<endpoint name="CreateCustomerInDB" xmlns="http://ws.apache.org/ns/synapse">
    <http method="post" uri-template="http://localhost:8290/services/CustomerDataService.HTTPEndpoint/customer/{uri.var.firstName}">
        <suspendOnFailure>
            <initialDuration>-1</initialDuration>
            <progressionFactor>1.0</progressionFactor>
        </suspendOnFailure>
        <markForSuspension>
            <retriesBeforeSuspension>0</retriesBeforeSuspension>
        </markForSuspension>
    </http>
</endpoint>
  1. 校验API层的参数提取逻辑:调用接口时查看自定义日志中打印的FName字段值,如果为空,说明JSON路径表达式和实际请求结构不匹配,根据实际入参结构调整json-eval表达式即可,例如如果入参是{"firstName":"Zhang"}结构,就将属性提取表达式改为json-eval($.firstName),确保uri.var.firstName能取到非空值。
可选优化

如果不想使用路径参数传值,可以将数据服务资源路径改为/customer,参数通过查询字符串传递,此时Endpoint的URI模板调整为http://localhost:8290/services/CustomerDataService.HTTPEndpoint/customer?firstName={uri.var.firstName},with-param保留query-param="firstName"配置即可,但数据插入类写操作不建议使用GET方法传递参数。

内容的提问来源于stack exchange,提问作者viggnah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 14:48:21