0

我是 wso2 的新手,目前我正在尝试将 mongodb 数据服务公开为 REST API。我按照教程将我的数据服务公开为 Rest 资源,如下所示:

<data>
  <config>...</config>
   <query id="count" useConfig="MongoDB">
      <expression>myCollection.count()</expression>
      <result outputType="json">{&#xd;"Documents": {&#xd;"Document": [&#xd;{&#xd;"Data": "$document"&#xd;}&#xd;]&#xd;}&#xd;}</result>
   </query>
   
   <operation name="count_op">
      <call-query href="count"/>
   </operation>
   
   <resource method="GET" path="users/count">
      <call-query href="count"/>
   </resource>
</data>

工作正常,但是当我尝试从我的 angular2 项目访问资源时,我偶然发现了 CORS 问题。我阅读了一些关于此的帖子,并认为我需要使用以下内容修改我的 Rest API:

<resource methods="OPTIONS" url-mapping="/*">
       <inSequence>
           <property action="set" name="HTTP_SC" scope="axis2"
               type="STRING" value="200"/>
           <property action="set" name="messageType" scope="axis2"
               type="STRING" value="application/json"/>
           <sequence key="rest_add_access_control_headers"/>
           <respond/>
       </inSequence>
       <outSequence/>
       <faultSequence>
           <sequence key="rest_add_access_control_headers"/>
           <respond/>
       </faultSequence>
   </resource>

我试图将此代码与我的数据服务定义(上面的那个)集成,但我无法让它工作,这让我想知道作为 REST 资源公开的数据服务是否与 Rest API 相同?似乎我无法在数据服务定义中调用任何元素或其他中介。我需要为此创建一个实际的 Rest API 吗?如果是这样,我如何使用我的 mongo 数据服务作为我的 Rest API 的资源?

编辑:我在尝试访问服务时从我的 angular2 项目中得到的 CORS 错误是“请求的资源上不存在‘Access-Control-Allow-Origin’标头。” 这是另一个话题。但它让我编辑了我的数据服务,所以我编辑了我的数据服务资源元素并添加了一个新元素:

   <resource method="GET" path="users/count">
   
      <inSequence>
         <property action="set" name="HTTP_SC" scope="axis2" type="STRING" value="200"/>
         <property action="set" name="messageType" scope="axis2" type="STRING" value="application/json"/>
         <sequence key="rest_add_access_control_headers"/>
         <respond/>
      </inSequence>
      <outSequence/>
      <faultSequence>
         <sequence key="rest_add_access_control_headers"/>
         <respond/>
      </faultSequence>
      <call-query href="count"/>
   </resource>

     <resource method="OPTIONS" path="users/count">
       <inSequence>
           <property action="set" name="HTTP_SC" scope="axis2"
               type="STRING" value="200"/>
           <property action="set" name="messageType" scope="axis2"
               type="STRING" value="application/json"/>
           <sequence key="rest_add_access_control_headers"/>
           <respond/>
       </inSequence>
       <outSequence/>
       <faultSequence>
           <sequence key="rest_add_access_control_headers"/>
           <respond/>
       </faultSequence>
   </resource>

rest_add_access_control_headers序列如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<sequence name="rest_add_access_control_headers" xmlns="http://ws.apache.org/ns/synapse">
    <property name="Access-Control-Allow-Origin" scope="transport"
        type="STRING" value="*"/>
    <property name="Access-Control-Allow-Methods" scope="transport"
        type="STRING" value="GET,POST,PUT,DELETE,OPTIONS"/>
    <property name="Access-Control-Allow-Headers" scope="transport"
        type="STRING" value="origin, content-type, accept, Authorization"/>
</sequence>

第一个似乎很好,但第二个使我的数据服务出现故障,在 managemenet 控制台中出现此错误:

DS Code: UNKNOWN_ERROR Source Data Service:- Name: mongodb_dataservice Location: \MongoDB.dbs Description: N/A Default Namespace: http://ws.wso2.org/dataservice Nested Exception:- java.lang.NullPointerException at org.wso2.carbon.dataservices.core.DataServiceFactory.createDataService(DataServiceFactory.java:207) at org.wso2.carbon.dataservices.core.DBDeployer.createDBService(DBDeployer.java:797) at org.wso2.carbon.dataservices.core.DBDeployer.processService(DBDeployer.java:1152) at org.wso2.carbon.dataservices.core.DBDeployer.deploy(DBDeployer.java:201) at org.apache.axis2.deployment.repository.util.DeploymentFileData.deploy(DeploymentFileData.java:136) at org.apache.axis2.deployment.DeploymentEngine.doDeploy(DeploymentEngine.java:807) at org.apache.axis2.deployment.repository.util.WSInfoList.update(WSInfoList.java:144) at org.apache.axis2.deployment.RepositoryListener.update(RepositoryListener.java:377) at org.apache.axis2.deployment.RepositoryListener.checkServices(RepositoryListener.java:254) at org.apache.axis2.deployment.RepositoryListener.startListener(RepositoryListener.java:371) at org.apache.axis2.deployment.scheduler.SchedulerTask.checkRepository(SchedulerTask.java:59) at org.apache.axis2.deployment.scheduler.SchedulerTask.run(SchedulerTask.java:67) at org.wso2.carbon.core.deployment.CarbonDeploymentSchedulerTask.runAxisDeployment(CarbonDeploymentSchedulerTask.java:93) at org.wso2.carbon.core.deployment.CarbonDeploymentSchedulerTask.run(CarbonDeploymentSchedulerTask.java:138) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) 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: java.lang.NullPointerException at org.wso2.carbon.dataservices.core.engine.DataService.init(DataService.java:352) at org.wso2.carbon.dataservices.core.DataServiceFactory.createDataService(DataServiceFactory.java:190) ... 20 more

同样,我不确定是否应该将此类代码放入数据服务定义中,因为该代码旨在用于 Rest API 定义,即您使用序列、中介等的地方......

如何使用 ESB API 使用我的数据服务?你能提供一个例子来说明如何做到这一点吗?我做了一些研究,但找不到任何东西。

4

1 回答 1

1

我可以知道您为什么无法调用数据服务吗?调用时是否遇到任何错误?如果您可以提供日志,那将很有帮助。此外,DSS 用于从 DB 中获取数据,最佳实践是提供一个 ESB API 来使用该服务,而不是直接将 DSS 服务暴露给外界

于 2018-03-27T04:40:56.427 回答