WSO EI6- Как записать ответ из DSS в файл CSV
Я создал сервис данных GetDepartmentData, как показано ниже:
<data enableBatchRequests="true" name="GetDepartmentDataService" transports="http https local">
<config enableOData="false" id="LocalXEDS">
<property name="carbon_datasource_name">LocalXEDB</property>
</config>
<query id="GetDeptQuery" useConfig="LocalXEDS">
<sql>select dept_id,name,location from dept
where dept_id=?</sql>
<result element="Departments" rowName="Department">
<element column="dept_id" name="dept_id" xsdType="string"/>
<element column="name" name="name" xsdType="string"/>
<element column="location" name="location" xsdType="string"/>
</result>
<param name="dept_id" sqlType="INTEGER"/>
</query>
<operation name="GetDepartment_Operation">
<description> Returns the departments for the given department id. 
 </description>
<call-query href="GetDeptQuery">
<with-param name="dept_id" query-param="dept_id"/>
</call-query>
</operation>
</data>
Я создал конечную точку WSDl "MyEP" для службы данных, и я создал ESB для вызова этой службы данных, и я хочу записать ответ в CSV-файл. Ниже приведен код для того же:
<payloadFactory media-type="xml">
<format>
<dat:GetDepartment_Operation xmlns:dat="http://ws.wso2.org/dataservice">
<dat:dept_id>$1</dat:dept_id>
</dat:GetDepartment_Operation>
</format>
<args>
<arg evaluator="xml" expression="//soapenv:Envelope/soapenv:Body/dat:GetDepartment_Operation/dat:dept_id" xmlns:dat="http://ws.wso2.org/dataservice" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"/>
</args>
</payloadFactory>
<call>
<endpoint key="myEP"/>
</call>
<log level="full"/>
<property name="transport.vfs.ReplyFileURI" scope="transport" type="STRING" value="file:///C:/Shilpa/sourcecode/FileConnector/Inbound?transport.vfs.Append=true"/>
<property name="transport.vfs.ReplyFileName" scope="transport" type="STRING" value="order.csv"/>
<property name="FORCE_SC_ACCEPTED" scope="axis2" type="STRING" value="true"/>
<property name="REST_URL_POSTFIX" scope="axis2" type="STRING" value=""/>
<property name="OUT_ONLY" scope="default" type="STRING" value="true"/>
<datamapper config="gov:datamapper/DBReadWritePSconfig.dmc" inputSchema="gov:datamapper/DBReadWritePSconfig_inputSchema.json" inputType="JSON" outputSchema="gov:datamapper/DBReadWritePSconfig_outputSchema.json" outputType="CSV"/>
<call>
<endpoint>
<address uri="vfs:file:///C:/Shilpa/sourcecode/FileConnector/Inbound/order.csv"/>
</endpoint>
</call>
Я получаю следующее сообщение журнала и ошибку:
WARN - XMLInputReader Element name not found : axis2ns5:Departments
[2017-03-08 21:00:36,240] [] ERROR - DataMapperMediator DataMapper mediator : mapping failed
Input type is incorrect or Invalid element found in the message payload : axis2ns5:Departments
4 ответа
Перед медиатором datamapper вы должны изменить полезную нагрузку, чтобы она содержала только узел Department. Вы можете использовать обогащающий медиатор следующим образом.
...
<enrich>
<source xmlns:p="http://ws.wso2.org/dataservice"
clone="true"
xpath="$body//p:Departments/*[1]"/>
<target type="body"/>
</enrich>
<datamapper config="gov:datamapper/DBReadWritePSconfig.dmc" inputSchema="gov:datamapper/DBReadWritePSconfig_inputSchema.json" inputType="JSON" outputSchema="gov:datamapper/DBReadWritePSconfig_outputSchema.json" outputType="CSV"/>
...
map_S_Envelope_S_root = function(){
var outputroot={};
var count_i_Department = 0;
outputroot = {};
outputroot.Departments = {};
outputroot.Departments.Department = {};
for(i_Department in inputsoapenv_Envelope.soapenv_Body.Departments.Department){
outputroot.Departments.Department.dept_id = inputsoapenv_Envelope.soapenv_Body.Departments.Department[i_Department].dept_id;
outputroot.Departments.Department.name = inputsoapenv_Envelope.soapenv_Body.Departments.Department[i_Department].name;
outputroot.Departments.Department.location = inputsoapenv_Envelope.soapenv_Body.Departments.Department[i_Department].location;
count_i_Department++;
}
return outputroot;
};
Пример моего входного файла (xml)
<?xml version="1.0" encoding="UTF-8"?>
<Department>
<dept_id>1</dept_id>
<name>dep1</name>
<location>loc1</location>
</Department>
Мой пример выходного файла (CSV)
id_dept, name, location 1, dep1, loc1
Моя InputSchema
{
"$schema" : "http://wso2.org/json-schema/wso2-data-mapper-v5.0.0/schema#",
"id" : "http://wso2jsonschema.org",
"title" : "Department",
"type" : "object",
"properties" : {
"dept_id" : {
"id" : "http://wso2jsonschema.org/dept_id",
"type" : "number"
},
"name" : {
"id" : "http://wso2jsonschema.org/name",
"type" : "string"
},
"location" : {
"id" : "http://wso2jsonschema.org/location",
"type" : "string"
}
}
}
Моя OutputSchema
{
"$schema" : "http://wso2.org/json-schema/wso2-data-mapper-v5.0.0/schema#",
"id" : "http://wso2jsonschema.org",
"title" : "Departments",
"type" : "object",
"properties" : {
"Department" : {
"id" : "http://wso2jsonschema.org/Department",
"type" : "object",
"properties" : {
"dept_id" : {
"id" : "http://wso2jsonschema.org/Department/dept_id",
"type" : "number"
},
"name" : {
"id" : "http://wso2jsonschema.org/Department/name",
"type" : "string"
},
"location" : {
"id" : "http://wso2jsonschema.org/Department/location",
"type" : "string"
}
}
}
},
"namespaces" : [ {
"prefix" : "axis2ns4",
"url" : "http://ws.wso2.org/dataservice"
} ]
}
Работает!!
@ Эрнесто Большое спасибо за вашу помощь.. Я изменил мой DMC, как показано ниже, и он работает абсолютно нормально..
map_S_Departments_S_Departments = function(){
var outputDepartments={};
var count_i_Department = 0;
outputDepartments = {};
outputDepartments.Department = [];
for(i_Department in inputDepartments.Department){
outputDepartments.Department[count_i_Department] = {};
outputDepartments.Department[count_i_Department].dept_id = inputDepartments.Department[i_Department].dept_id;
outputDepartments.Department[count_i_Department].name = inputDepartments.Department[i_Department].name;
outputDepartments.Department[count_i_Department].location = inputDepartments.Department[i_Department].location;
count_i_Department++;
}
return outputDepartments;
};
выход:
110.0,PRODUCTION SUPPORT,MONTEREY, CA
110.0,DOCUMENTATION,WEXFORD, PA
110.0,ABC,wer