WSO2 EI: DS 错误消息: 'CallQuery.extractParams'错误



我有一个作为REST资源公开的数据服务,它将数据插入MySQL表。当我直接从postman调用这个资源时,它成功地插入了数据。但是,当我通过端点调用它时,它会给出以下错误:

ERROR {DBInOnlyMessageReceiver} - Error in in-only message receiver DS Fault Message: Error in DS non result invoke.
DS Code: INCOMPATIBLE_PARAMETERS_ERROR
Nested Exception:-
javax.xml.stream.XMLStreamException: DS Fault Message: Error in 'CallQuery.extractParams', cannot find parameter with type:query-param name:firstName
DS Code: INCOMPATIBLE_PARAMETERS_ERROR
Source Data Service:-
Name: CustomerDataService
Location: /Applications/IntegrationStudio.app/Contents/Eclipse/runtime/microesb/tmp/carbonapps/-1234/1657777407345TestCompositeApplication_1.0.0.car/CustomerDataService_1.0.0/CustomerDataService-1.0.0.dbs
Description: 
Default Namespace: http://ws.wso2.org/dataservice
Current Request Name: _getcustomer_firstname
Current Params: {}

at org.wso2.micro.integrator.dataservices.core.dispatch.SingleDataServiceRequest.processSingleRequest(SingleDataServiceRequest.java:117)
at org.wso2.micro.integrator.dataservices.core.dispatch.SingleDataServiceRequest.processRequest(SingleDataServiceRequest.java:66)
at org.wso2.micro.integrator.dataservices.core.dispatch.DataServiceRequest.dispatch(DataServiceRequest.java:358)
at org.wso2.micro.integrator.dataservices.core.DataServiceProcessor.dispatch(DataServiceProcessor.java:40)
at org.wso2.micro.integrator.dataservices.core.DBInOnlyMessageReceiver.invokeBusinessLogic(DBInOnlyMessageReceiver.java:52)
at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:110)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
at org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:375)
at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:189)
at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: javax.xml.stream.XMLStreamException: DS Fault Message: Error in 'CallQuery.extractParams', cannot find parameter with type:query-param name:firstName
DS Code: INCOMPATIBLE_PARAMETERS_ERROR
Source Data Service:-
Name: CustomerDataService
Location: /Applications/IntegrationStudio.app/Contents/Eclipse/runtime/microesb/tmp/carbonapps/-1234/1657777407345TestCompositeApplication_1.0.0.car/CustomerDataService_1.0.0/CustomerDataService-1.0.0.dbs
Description: 
Default Namespace: http://ws.wso2.org/dataservice
Current Request Name: _getcustomer_firstname
Current Params: {}
at org.wso2.micro.integrator.dataservices.core.engine.DSOMDataSource.execute(DSOMDataSource.java:100)
at org.wso2.micro.integrator.dataservices.core.engine.DSOMDataSource.serialize(DSOMDataSource.java:105)
at org.wso2.micro.integrator.dataservices.core.engine.DSOMDataSource.executeInOnly(DSOMDataSource.java:78)
at org.wso2.micro.integrator.dataservices.core.dispatch.SingleDataServiceRequest.processSingleRequest(SingleDataServiceRequest.java:115)
... 12 more
Caused by: DS Fault Message: Error in 'CallQuery.extractParams', cannot find parameter with type:query-param name:firstName
DS Code: INCOMPATIBLE_PARAMETERS_ERROR
Source Data Service:-
Name: CustomerDataService
Location: /Applications/IntegrationStudio.app/Contents/Eclipse/runtime/microesb/tmp/carbonapps/-1234/1657777407345TestCompositeApplication_1.0.0.car/CustomerDataService_1.0.0/CustomerDataService-1.0.0.dbs
Description: 
Default Namespace: http://ws.wso2.org/dataservice
Current Request Name: _getcustomer_firstname
Current Params: {}
at org.wso2.micro.integrator.dataservices.core.engine.CallQuery.extractParams(CallQuery.java:337)
at org.wso2.micro.integrator.dataservices.core.engine.CallQuery.executeElement(CallQuery.java:278)
at org.wso2.micro.integrator.dataservices.core.engine.OutputElement.execute(OutputElement.java:88)
at org.wso2.micro.integrator.dataservices.core.description.resource.Resource.execute(Resource.java:66)
at org.wso2.micro.integrator.dataservices.core.engine.DataService.invoke(DataService.java:613)
at org.wso2.micro.integrator.dataservices.core.engine.DSOMDataSource.execute(DSOMDataSource.java:94)
... 15 more
[2022-07-14 11:13:54,166] ERROR {ServerWorker} - Error processing GET request for : /services/CustomerDataService.HTTPEndpoint/customer/John org.apache.axis2.AxisFault: DS Fault Message: Error in DS non result invoke.
DS Code: INCOMPATIBLE_PARAMETERS_ERROR
Nested Exception:-
javax.xml.stream.XMLStreamException: DS Fault Message: Error in 'CallQuery.extractParams', cannot find parameter with type:query-param name:firstName
DS Code: INCOMPATIBLE_PARAMETERS_ERROR
Source Data Service:-
Name: CustomerDataService
Location: /Applications/IntegrationStudio.app/Contents/Eclipse/runtime/microesb/tmp/carbonapps/-1234/1657777407345TestCompositeApplication_1.0.0.car/CustomerDataService_1.0.0/CustomerDataService-1.0.0.dbs
Description: 
Default Namespace: http://ws.wso2.org/dataservice
Current Request Name: _getcustomer_firstname
Current Params: {}

at org.wso2.micro.integrator.dataservices.core.DBUtils.createAxisFault(DBUtils.java:814)
at org.wso2.micro.integrator.dataservices.core.DBInOnlyMessageReceiver.invokeBusinessLogic(DBInOnlyMessageReceiver.java:57)
at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:110)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
at org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:375)
at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:189)
at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: javax.xml.stream.XMLStreamException: DS Fault Message: Error in 'CallQuery.extractParams', cannot find parameter with type:query-param name:firstName
DS Code: INCOMPATIBLE_PARAMETERS_ERROR
Source Data Service:-
Name: CustomerDataService
Location: /Applications/IntegrationStudio.app/Contents/Eclipse/runtime/microesb/tmp/carbonapps/-1234/1657777407345TestCompositeApplication_1.0.0.car/CustomerDataService_1.0.0/CustomerDataService-1.0.0.dbs
Description: 
Default Namespace: http://ws.wso2.org/dataservice
Current Request Name: _getcustomer_firstname
Current Params: {}
at org.wso2.micro.integrator.dataservices.core.engine.DSOMDataSource.execute(DSOMDataSource.java:100)
at org.wso2.micro.integrator.dataservices.core.engine.DSOMDataSource.serialize(DSOMDataSource.java:105)
at org.wso2.micro.integrator.dataservices.core.engine.DSOMDataSource.executeInOnly(DSOMDataSource.java:78)
at org.wso2.micro.integrator.dataservices.core.dispatch.SingleDataServiceRequest.processSingleRequest(SingleDataServiceRequest.java:115)
at org.wso2.micro.integrator.dataservices.core.dispatch.SingleDataServiceRequest.processRequest(SingleDataServiceRequest.java:66)
at org.wso2.micro.integrator.dataservices.core.dispatch.DataServiceRequest.dispatch(DataServiceRequest.java:358)
at org.wso2.micro.integrator.dataservices.core.DataServiceProcessor.dispatch(DataServiceProcessor.java:40)
at org.wso2.micro.integrator.dataservices.core.DBInOnlyMessageReceiver.invokeBusinessLogic(DBInOnlyMessageReceiver.java:52)
... 8 more
Caused by: DS Fault Message: Error in 'CallQuery.extractParams', cannot find parameter with type:query-param name:firstName
DS Code: INCOMPATIBLE_PARAMETERS_ERROR
Source Data Service:-
Name: CustomerDataService
Location: /Applications/IntegrationStudio.app/Contents/Eclipse/runtime/microesb/tmp/carbonapps/-1234/1657777407345TestCompositeApplication_1.0.0.car/CustomerDataService_1.0.0/CustomerDataService-1.0.0.dbs
Description: 
Default Namespace: http://ws.wso2.org/dataservice
Current Request Name: _getcustomer_firstname
Current Params: {}
at org.wso2.micro.integrator.dataservices.core.engine.CallQuery.extractParams(CallQuery.java:337)
at org.wso2.micro.integrator.dataservices.core.engine.CallQuery.executeElement(CallQuery.java:278)
at org.wso2.micro.integrator.dataservices.core.engine.OutputElement.execute(OutputElement.java:88)
at org.wso2.micro.integrator.dataservices.core.description.resource.Resource.execute(Resource.java:66)
at org.wso2.micro.integrator.dataservices.core.engine.DataService.invoke(DataService.java:613)
at org.wso2.micro.integrator.dataservices.core.engine.DSOMDataSource.execute(DSOMDataSource.java:94)
... 15 more

调用数据服务REST资源的端点:

<?xml version="1.0" encoding="UTF-8"?>
<endpoint name="CreateCustomerInDB" xmlns="http://ws.apache.org/ns/synapse">
<http method="get" uri-template="http://localhost:8290/services/CustomerDataService.HTTPEndpoint/customer/{uri.var.firstName}">
<suspendOnFailure>
<initialDuration>-1</initialDuration>
<progressionFactor>1.0</progressionFactor>
</suspendOnFailure>
<markForSuspension>
<retriesBeforeSuspension>0</retriesBeforeSuspension>
</markForSuspension>
</http>
</endpoint>

数据服务:

<data name="CustomerDataService" serviceNamespace="" serviceGroup="" transports="">
<description />
<config id="CustomerDatasource">
<property name="driverClassName">com.mysql.cj.jdbc.Driver</property>
<property name="url">jdbc:mysql://localhost:3306/demopresentation</property>
<property name="username">root</property>
<property name="password" />
</config>
<query id="CreateCustomerEntry" useConfig="CustomerDatasource">
<sql>insert into customers (FirstName) values (:firstName)</sql>
<param name="firstName" paramType="SCALAR" sqlType="STRING" type="IN" />
</query>
<resource path="customer/{firstName}" method="GET">
<call-query href="CreateCustomerEntry"          >
<with-param name="firstName" query-param="firstName" />
</call-query>
</resource>
</data>

集成的入口点,然后调用上面的代码:

<?xml version="1.0" encoding="UTF-8"?>
<api context="/person" name="PersonAPI" xmlns="http://ws.apache.org/ns/synapse">
<resource methods="POST GET" uri-template="/customer">
<inSequence>
<log description="Full incoming msg log" level="full" separator=" >>> "/>
<propertyGroup>
<property expression="json-eval($.name.first_name)" name="uri.var.firstName" scope="default" type="STRING"/>
<property expression="json-eval($.name.last_name)" name="uri.var.lastName" scope="default" type="STRING"/>
<property expression="json-eval($.date_of_birth)" name="uri.var.dob" scope="default" type="STRING"/>
<property expression="json-eval($.email)" name="uri.var.email" scope="default" type="STRING"/>
<property name="TEST" scope="default" type="STRING" value="TEST_VALUE"/>
</propertyGroup>
<log level="custom">
<property expression="get-property('uri.var.firstName')" name="FName"/>
<property expression="get-property('uri.var.lastName')" name="LName"/>
<property expression="get-property('uri.var.dob')" name="DOB"/>
<property expression="get-property('uri.var.email')" name="Email"/>
<property expression="get-property('TEST')" name="TESTVAR"/>
</log>
<call>
<endpoint key="CreateCustomerInDB"/>
</call>
</inSequence>
<outSequence/>
<faultSequence/>
</resource>
</api>

首先,使用GET向数据库插入数据是一个非常糟糕的主意。只是不要用那种方式去做——这种练习不遵循其他规则。问题是没有将uri.var.firstName参数传递给端点。问题是,你怎么称呼这个端点?是否设置了呼叫端点前的:uri.var.firstName,例如:

<property value="TestName" name="uri.var.firstName" scope="default" type="STRING"/>

更新:

在POST请求中发送JSON数据到DataService,您可以遵循该文档:data i JSON格式有合适的JSON数据结构是很重要的。

最新更新