代码之家  ›  专栏  ›  技术社区  ›  AspiringProgrammer

ApikitRuntime异常:无效的API描述符+Raml解析器未捕获异常:null,这是什么意思?

  •  0
  • AspiringProgrammer  · 技术社区  · 7 年前

    我已经生成了一个apikit路由器,它路由到raml文件并从中生成xml流。

    <when expression="message.inboundProperties.role == &quot;backoffice&quot;"> <apikit:router config-ref="backoffice-config" doc:name="Backoffice APIKit Router"/></when> ...
    

    当我开始运行项目时,我收到一个错误

    组织。骡子单元apikit。例外ApikitRuntimeException:无效的API描述符--发现错误:1 Raml解析器未捕获异常:null

    现在,我的问题是: 有人能给我解释一下这个例外是什么意思吗?我想确定导致异常的原因。

    我试图查找有关此类异常的文档,但尚未找到相关文档(如果有,请帮助我查找链接)。

    [已编辑]

    我的RAML定义只是一个模拟测试:

    #%RAML 1.0
    title: mocktest
    mediaType: application/json
    
    /mocktest:
      description: Describes a list of Employees.
    
      get:
        description: Request Body for a new Employee Post Request.
        responses: 
          200:
            description: OK Responsebody for a new EMployee POst Req.
            body: 
              application/json:
                example:  |
                  {
                  "employeeId":2231,
                  "employeeName":"Lorem Ipsum"
                  }
    

    如果这有帮助: 我没有向apikit路由器流添加http侦听器 因此,理论上(我的),它将使用主HTTP侦听器路由到RAML文件中生成的xml流。

    主要目标: 是根据inboundProperty来路由消息,其值是“backoffice”还是“client”,这是apikit路由器位于选项子流内的原因。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Jason Estevan    7 年前

    好的,我知道你想做什么了,谢谢你提供的额外信息。

    RAML 是为希望使用您的服务的客户签订的“合同”。它列出了如何呼叫您的服务;端点地址是什么,使用什么方法,我的请求负载应该是什么格式。以及需要返回哪些信息。使用RAML文件中的所有信息,他们应该能够与您的服务集成,而无需联系开发人员。

    MuleSoft已将RAML紧密集成到API开发周期中,他们希望您遵循该周期。其中一个方面是APIkit路由器组件。它根据HTTP请求自动在接口(RAML文件)和后端流之间路由请求。

    然而,在您的场景中,您正在APIkit之前添加http端点和自定义逻辑。这些更改打破了RAML文件和代码之间的强制链接。请注意,您的自定义流接受入站属性“role”,但未在RAML文件中指定。您的客户在登录到您的服务时不会意识到此属性的存在。Mulesoft希望防止这种不匹配的发生,这就是为什么会出现错误。

    我建议您将RAML文件修改为:

    ...
    get:
        description: Request Body for a new Employee Post Request.
        queryParameters:
          role: 
        responses:
    ...
    

    和你的未来

    <flow name="get:/mocktest:backoffice-config">
        <choice doc:name="Choice">
            <when expression="#[message.inboundProperties.role == 'backoffice']">..</when>
            <otherwise>...</otherwise>
        </choice>
    </flow>
    

    希望这是有意义的。