【问题标题】:Is there a way to set a default value for a property mediator if the property does not exist in the request body?如果请求正文中不存在属性,有没有办法为属性调解器设置默认值?
【发布时间】:2019-08-16 22:25:18
【问题描述】:

我正在 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": $1

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

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

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

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

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

【问题讨论】:

    标签: wso2 wso2esb wso2ei synapse


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!是的,我有点怀疑是否有办法做到这一点,只是想我应该问问社区。我会考虑使用 XSLT 转换或脚本中介,谢谢您的建议。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      有条件的 xpath ? 这可能会奏效。玩弄下面的代码。

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

      【讨论】:

        猜你喜欢
        • 2022-06-22
        • 1970-01-01
        • 2019-05-30
        • 1970-01-01
        • 2011-01-31
        • 2011-06-02
        • 2013-03-31
        • 2016-11-12
        • 1970-01-01
        相关资源
        最近更新 更多