如果请求正文中不存在 属性,是否可以为 属性 中介设置默认值?

Is there a way to set a default value for a property mediator if the property does not exist in the request body?

我正在 WSO2 EI/ESB 中构建一个简单的 API。我将每个请求参数保存到如下属性:

<property expression="json-eval($.client_id)" name="client_id" scope="default" type="STRING"/>

然后使用负载工厂构建负载:

<payloadFactory media-type="json">
                <format>       
                    {

                        "req_type": "1",
                        "client_id": 

                    }
                </format>
                <args>
                    <arg evaluator="xml" expression="get-property('client_id')"/>
                </args>
</payloadFactory>

但是,如果我发送一条空消息 {}(没有 client_id),则 $1 参数中没有任何内容,生成的有效负载将无法验证:

{
                    "req_type": "1",
                    "client_id:
}

我想知道在 属性 中介器中保存这个表达式时是否有办法设置一个默认值?例如: <property expression="json-eval($.client_id)" name="client_id" scope="default" type="STRING" defaultValue="0"/> 或类似的东西。

我知道我可以实施过滤器来检查字段是否存在并验证它,但我发现这可能会变得有点混乱。

我认为没有办法做到这一点。您将不得不使用过滤器。

不,您不能使用 payloadFactory。您必须从不同的解决方案中进行选择:

  • 用更灵活的 XSLT 转换替换您的 payloadFactory(最佳解决方案)
  • 添加过滤器以构建您的参数并设置默认值
  • 使用脚本调解器来替换痛苦的过滤器,并能够轻松管理 if/then/else 语句。然后您可以从脚本中介初始化 属性。

条件 xpath ? 这可能有效。尝试下面的代码。

<enrich>
    <source clone="true" type="custom" xpath="0"  />
    <target action="replace" type="custom" xpath="" property="boolean(string-length(//client_id) != 0)" />
</enrich>