0

我尝试按照本教程创建带有 JSON 输出的 DSS: https ://docs.wso2.com/display/EI620/Using+JSON+with+Data+Services

它适用于简单的查询,我可以毫无问题地格式化输出。

现在我正在尝试添加一个输入参数来按 ID 过滤记录,但它对我不起作用。如教程中所述,我的 REST 是:GET http://{server_host}/services/Promemoria_PROMEMORIA_Tools/getCount/2

回应是:

Error processing GET request for : /services/Promemoria_PROMEMORIA_Tools/getCount/2</p><p>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:idp
DS Code: INCOMPATIBLE_PARAMETERS_ERROR
Source Data Service:-
Name: Promemoria_PROMEMORIA_Tools
Location: /Promemoria_PROMEMORIA_Tools.dbs
Description: Tool per permettere ad Amenta di inserire le pratiche fatte a mano.
Default Namespace: http://ws.wso2.org/dataservice
Current Request Name: _getgetcount_idp
Current Params: {}

我也尝试过: GET http://{server_host}/services/Promemoria_PROMEMORIA_Tools/getCount?idp=2 但这是错误的,因为无法识别操作。

我将属性 defaultValue="3" 放在查询定义中的 idp 上,它开始工作......但它忽略了 REST 中的值。

怎么了?这是我的 DSS 代码

<data name="Promemoria_PROMEMORIA_Tools" transports="http https local">
   <description>Tool per permettere di inserire le pratiche fatte a mano.</description>
   <config enableOData="false" id="OracleServizio_Promemoria2">
      <property name="carbon_datasource_name">OracleServizio_Promemoria2</property>
   </config>
   <query id="getByCF" useConfig="OracleServizio_Promemoria2">
      <sql>SELECT ID_ABILITAZIONE, ID_SERVIZIO, DESCR_SERVIZIO, CF_UTENTE, ID_CANALE_NOTIFICA, CANALE_NOTIFICA, ID_CONTATTO, CONTATTO, CANALE_ACQ, DATA_ACQ, CF_ACQ, PROTOCOLLO, DATA_PROT, PROV_UFF FROM SERVIZIO_PROMEMORIA.SE_MI_SCORDO_ABIL_SPORTELLO a where a.CF_UTENTE = :cf union all SELECT ID_ABILITAZIONE, ID_SERVIZIO, DESCR_SERVIZIO, CF_UTENTE, ID_CANALE_NOTIFICA, CANALE_NOTIFICA, ID_CONTATTO, CONTATTO, CANALE_ACQ, DATA_ACQ, CF_ACQ, PROTOCOLLO, DATA_PROT, PROV_UFF FROM SERVIZIO_PROMEMORIA.SE_MI_SCORDO_ABIL b where b.CF_UTENTE = :cf and b.CF_ACQ &lt;&gt; 'BATCH'</sql>
      <result escapeNonPrintableChar="true" outputType="json">{&#xd;    "list": {&#xd;      "item": [{&#xd;         "id": "$ID_ABILITAZIONE",&#xd;          "service": {&#xd;               "id": "$ID_SERVIZIO",&#xd;              "info": "$DESCR_SERVIZIO"&#xd;          },&#xd;         "cfUser": "$CF_UTENTE",&#xd;            "channel": {&#xd;               "id": "$ID_CANALE_NOTIFICA",&#xd;               "info": "$CANALE_NOTIFICA"&#xd;         },&#xd;         "address": {&#xd;               "id": "$ID_CONTATTO",&#xd;              "info": "$CONTATTO"&#xd;            }&#xd;      }]&#xd; }&#xd;}</result>
      <param name="cf" sqlType="STRING"/>
   </query>
   <query id="getCount" useConfig="OracleServizio_Promemoria2">
      <sql>SELECT ID_SERVIZIO, DESCR_SERVIZIO, ID_CANALE_NOTIFICA, CANALE_NOTIFICA, count(*) as recno FROM SERVIZIO_PROMEMORIA.SE_MI_SCORDO_ABIL_SPORTELLO a where a.ID_SERVIZIO=:idp group by ID_SERVIZIO, DESCR_SERVIZIO, ID_CANALE_NOTIFICA, CANALE_NOTIFICA</sql>
      <param name="idp" paramType="SCALAR" sqlType="INTEGER"/>
      <result escapeNonPrintableChar="true" outputType="json">{&#xd;    "list": {&#xd;      "item": [{&#xd;         "items": "$recno",&#xd;         "service": {&#xd;               "id": "$ID_SERVIZIO",&#xd;              "info": "$DESCR_SERVIZIO"&#xd;          },&#xd;         "channel": {&#xd;               "id": "$ID_CANALE_NOTIFICA",&#xd;               "info": "$CANALE_NOTIFICA"&#xd;         }&#xd;      }]&#xd; }&#xd;}</result>
   </query>
   <resource method="GET" path="getByCF/{cf}">
      <call-query href="getByCF">
         <with-param name="cf" query-param="cf"/>
      </call-query>
   </resource>
   <resource method="GET" path="getCount/{idp}">
      <call-query href="getCount">
         <with-param name="idp" query-param="idp"/>
      </call-query>
   </resource>
</data>

罗伯托

4

2 回答 2

1

您可以通过从 DSS 代码中的资源中删除 /{idp} 来尝试相同的操作吗?

<resource method="GET" path="getCount">
  <call-query href="getCount">
     <with-param name="idp" query-param="idp"/>
  </call-query>

于 2020-04-05T10:26:02.893 回答
1

我解决了这个问题,但我不太确定如何:) 我尝试从一开始就解释它。我通过构建 SOAP 服务的 WSO2 控制台创建向导创建了该服务。然后我使用在线 xml 编辑器编辑了服务,并将其转换为 REST。它在选择中工作正常,输出正确,但我无法使用输入参数(如上所述)。

在我的测试期间,我将“getCount”操作更改为 POST,但没有任何结果,但是当我将其放回 GET 时,它开始神奇地工作。其他操作仍然无法正常工作。

我认为 WSO2 在某个地方存储了错误的配置,可能是由向导创建的。我完全删除了该服务并从一个空的 .dbs 文件重新启动,手动编写它。我用“上传”将它加载到 WSO2 中,它工作正常。我使用在线 xml 编辑器对其进行了编辑,它仍然运行良好。

就这样。

于 2020-04-11T15:11:32.157 回答