wso2响应属性来过滤介体

时间:2016-08-30 05:40:39

标签: wso2 wso2esb wso2carbon

我正在尝试使用Filter mediator进行响应,以检查响应是否为集合。

所以我在这里做的是检查belongs_to_collection中的元素id是否为数字

<property expression="/soapenv:Envelope/soapenv:Body/root:movie/belongs_to_collection/id" name="collection" scope="default" type="STRING"/>
<filter description="" regex="[0-9]+" source="get-property('collection')">...</filter>

这是我的完整api配置 http://pastebin.com/QA3GCd1W

这里是过滤器的响应 http://pastebin.com/0dxweJu3

2 个答案:

答案 0 :(得分:2)

如果在表达式中使用名称空间前缀,则需要定义这些名称空间。例如:

    <property expression="/root:movie/belongs_to_collection/id" 
name="collection" scope="default" type="STRING" xmlns:root="www.wso2esb.com"/>

我在使用您的API时看到的响应是

<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>
        <jsonObject>
            <belongs_to_collection>
                <id>8650</id>
...

你的根元素是soapenv:Envelope标签,所以你不必再把它放在你的表达式中了。 /开头是指根元素。之后的任何内容都会引用根元素中的元素。

所以表达式应该如下:

<property xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
name="collection" expression="/soapenv:Body/jsonObject/belongs_to_collection/id" 
scope="default" type="STRING"/>

答案 1 :(得分:2)

如果您不想处理命名空间,可以像这样使用local-name()

<property name="collection" 
expression="//*[local-name()='belongs_to_collection']/*[local-name()='id']/text()" 
scope="default" 
type="STRING"/>