Не могли бы вы посоветовать, как получить более одной строки? Мой источник API:
<inSequence xmlns = "http://ws.apache.org/ns/synapse">
<property expression = "json-eval($.vendorId)" name = "vendorId" scope = "default" type = "STRING"/>
<dblookup>
<connection>
<pool>
<dsName>MyDS</dsName>
</pool>
</connection>
<statement>
<sql><![CDATA[select * from db_view v where v.vendorId = nvl(?, v.vendorId)]]></sql>
<parameter expression = "$ctx:vendorId" type = "VARCHAR"/>
<result column = "vendorId" name = "vendorId"/>
<result column = "vendorName" name = "vendorName"/>
</statement>
</dblookup>
<filter xpath = "boolean($ctx:vendorId)">
<then>
<payloadFactory media-type = "json">
<format>{"result": { "vendorId" : "$1","vendorName" : "$2"}}</format>
<args>
<arg evaluator = "xml" expression = "$ctx:vendorId" literal = "false"/>
<arg evaluator = "xml" expression = "$ctx:vendorName" literal = "false"/>
</args>
</payloadFactory>
</then>
<else>
<payloadFactory media-type = "json">
<format>{"response" : { "code" : "01","message" : "fail"}}</format>
</payloadFactory>
</else>
</filter>
</inSequence>
Мое представление базы данных возвращает 5 строк, но я получаю только первую строку из запроса GET:
{"result": { "vendorId" : "123", "vendorName" : "My Vendor N1" }}
Также, если я передам параметр vendorId = 321, API должно вернуть 0 строк. В текущий момент ВСЕГДА возвращает первую строку из представления. Почему и как заставить это работать? заранее спасибо
ВЫЗЫВАТЬ Медиатор:
<resource methods = "GET" uri-template = "/get/supplier/{filterQuery}">
<inSequence>
<property name = "operation" value = "view" scope = "default" type = "STRING"/>
<log level = "full" separator = "|">
<property name = "operation" expression = "get-property('operation')"/>
<property name = "step" value = "request"/>
</log>
<property name = "filterQuery" expression = "get-property('uri.var.filterQuery')" scope = "default" type = "STRING"/>
<log level = "full" separator = "|">
<property name = "filterQuery" expression = "$ctx:filterQuery"/>
</log>
<callout serviceURL = "http://...:8280/services/serviceName" action = "/vendors/$ctx:filterQuery">
<source type = "envelope"/>
<target key = "response"/>
</callout>
<log level = "custom" separator = "|">
<property name = "MESSAGE" expression = "$ctx:response"/>
</log>
<property name = "res" expression = "$ctx:response" scope = "default" type = "OM"/>
<property name = "NO_ENTITY_BODY" scope = "axis2" action = "remove"/>
<property name = "RESPONSE" value = "true" scope = "default" type = "STRING"/>
<property name = "messageType" value = "application/json" scope = "axis2" type = "STRING"/>
<property name = "contentType" value = "application/json" scope = "transport" type = "STRING"/>
<payloadFactory media-type = "json">
<format>{"vendorId": "$1","vendorName": "$2"}</format>
<args/>
</payloadFactory>
<log level = "full" separator = "|">
<property name = "operation" expression = "$ctx:operation"/>
<property name = "step" value = "response"/>
</log>
<respond/>
</inSequence>
<faultSequence>
<payloadFactory media-type = "json">
<format>{"response" : {"code" : "01", "message" : "fail"}}</format>
<args/>
</payloadFactory>
</faultSequence>
</resource>
Это нормальное поведение. Как вы можете прочитать в Документация посредника DBLookup :
The DBLookup mediator can set a property from one row in a result set. It cannot return multiple rows. If you need to get multiple records, or if you have a table with multiple parameters (such as URLs), you can use the WSO2 Data Services Server to create a data service and invoke that service from the ESB using the Callout mediator instead.
Вы не можете использовать посредник dblookup, как уже упоминалось, но вы можете использовать Источники данных. Краткий пример источника данных для службы данных Get Method;
<data name = "RDBMSDataService" serviceStatus = "active" transports = "http https local">
<config enableOData = "false" id = "Datasource">
<property name = "driverClassName">com.mysql.jdbc.Driver</property>
<property name = "url">jdbc:mysql://localhost:3306/Employees</property>
<property name = "username">root</property>
<property name = "password">password</property>
</config>
<resource method = "GET" path = "Employee/{EmployeeNumber}">
<call-query href = "GetEmployeeDetails">
<with-param name = "EmployeeNumber" query-param = "EmployeeNumber"/>
</call-query>
</resource>
<query id = "GetEmployeeDetails" useConfig = "Datasource">
<sql>select EmployeeNumber, FirstName, LastName, Email, Salary from Employees where EmployeeNumber=:EmployeeNumber</sql>
<result outputType = "json">{
"Employees":{
"Employee":[
{
"EmployeeNumber":"$EmployeeNumber",
"FirstName":"$FirstName",
"LastName":"$LastName",
"Email":"$Email",
"Salary":"$Salary"
}
]
}
}</result>
<param name = "EmployeeNumber" sqlType = "STRING"/>
</query>
</data>
Вы можете создать этот файл .dbs и развернуть его. Затем вы можете вызвать этот компонент как http://localhost:8290/services/RDBMSDataService/Employee/{EmployeeNumber} с определенными параметрами, после чего он вернет json:
{
"Employees": {
"Employee": [
{
"EmployeeNumber": "5012",
"FirstName": "Will",
"LastName": "Smith",
"Email": "[email protected]",
"Salary": "13500.0"
},
{
"EmployeeNumber": "5013",
"FirstName": "Parker",
"LastName": "Peter",
"Email": "[email protected]",
"Salary": "15500.0"
}
]
}
}
Вы можете взять значение из контекста, например:
<property expression = "json-eval($.Employees)" name = "EmployeeList" scope = "default" type = "STRING"/>
большое спасибо. Не подскажете, как мне передать параметр (свойство filterQuery) посреднику Callout? В документации ничего об этом не нашел. Заранее спасибо.