【问题标题】:How to retrieve statusCode from ApiKit mapping in Mule如何从 Mule 中的 ApiKit 映射中检索 statusCode
【发布时间】:2016-07-07 14:58:25
【问题描述】:

我们希望处理我们在异常策略中使用相同进程捕获的所有异常。它是由 apikit 生成的。我们首先使用自定义组件发送很多内容,然后生成 json 响应。在使用 DataWeave 的响应中,我们想要设置相同的 statusCode。但是,statusCode 似乎不是可检索的变量。我是正确的,还是有一个很好的方法来检索它?

    <apikit:mapping-exception-strategy xmlns:apikit="http://www.mulesoft.org/schema/mule/apikit" name="svc0031_hotel-apiKitGlobalExceptionMapping">
         <apikit:mapping statusCode="504">
            <apikit:exception value="org.mule.api.transformer.TransformerMessagingException"/>
            <flow-ref name="svc0031_manageErrors" doc:name="Manage Error"/>
        </apikit:mapping>
		<apikit:mapping statusCode="404">
            <apikit:exception value="org.mule.api.transformer.TransformerMessagingException"/>
            <flow-ref name="svc0031_manageErrors" doc:name="Manage Error"/>
        </apikit:mapping>
    </apikit:mapping-exception-strategy>
    <sub-flow name="svc0031_manageErrors">
        <set-payload value="#[groovy:message.exceptionPayload.rootException.message]" doc:name="Set BIP Payload"/>
        <custom-transformer class="se.zystems.baseline.BaselineLogging" doc:name="Log BIP Outgoing">
            <spring:property name="Level" value="ERROR"/>
            <spring:property name="ObjectId" value="CatchErrors"/>
            <spring:property name="TransactionStatus" value="failed"/>
        </custom-transformer>
        <dw:transform-message doc:name="Transform Message">
            <dw:set-payload><![CDATA[%dw 1.0
%output application/json
---
{ 
  status : 400,
  message : payload,
  code : 42,
  more_info :"https://anypoint.mulesoft.com/apiplatform/nordic-choice-hotels"
}]]></dw:set-payload>
        </dw:transform-message>
        <logger level="INFO" doc:name="Logger"/>
    </sub-flow>

【问题讨论】:

    标签: mule mule-component anypoint-studio


    【解决方案1】:

    很好,

    如果您使用 http.status 创建一个变量,那么您可以在映射器中使用它:

     <flow name="test">
            <set-variable variableName="httpStatus" value="#[message.inboundProperties['http.status']" doc:name="Variable"/>
            <dw:transform-message doc:name="Transform Message">
                <dw:set-payload><![CDATA[%dw 1.0
    %output application/json
    
    ---
    { 
      status : flowVars.httpStatus,
      message : payload,
      code : 42,
      more_info :"https://anypoint.mulesoft.com/apiplatform/nordic-choice-hotels"
    }]]></dw:set-payload>
            </dw:transform-message>
        </flow>
    

    【讨论】:

    • 感谢您的建议,但是在 message.inboundProperties['http.status'] 中没有传递 apikit:mapping statusCode="value" 因此无法在以后的流程中使用。跨度>
    • 您几乎是对的,请检查我的回答。再次感谢您!
    【解决方案2】:

    感谢Jesús Pablo Fernández的回答,我发现了statusCode值的存储位置

    他的回答几乎是正确的,但是 statusCode 不是存储在 message.inboundProperties['http.status'] 中,而是存储在 message.outboundProperties['http.status'] 中。甚至不需要提取变量,只需像这样直接在数据转换器中访问它:

            <dw:transform-message doc:name="Transform Message">
                <dw:set-payload><![CDATA[%dw 1.0
    %output application/json
    ---
    { 
      status : outboundProperties['http.status'],
      message : payload,
      code : 42,
      more_info :"https://anypoint.mulesoft.com/apiplatform/nordic-choice-hotels"
    }]]></dw:set-payload>
            </dw:transform-message>

    【讨论】:

      【解决方案3】:

      APIKitExceptionStrategy 中定义的状态代码将是那些在响应标头中作为 http.status 发送回的状态代码,因为相应的异常将被引发。 例如,

      <apikit:mapping statusCode="504">
              <apikit:exception value="org.mule.api.transformer.TransformerMessagingException"/>
              <flow-ref name="svc0031_manageErrors" doc:name="Manage Error"/>
          </apikit:mapping>
      

      表示当 org.mule.api.transformer.TransformerMessagingException 异常被抛出并被此异常块捕获时,将返回 504 状态代码作为响应头。 如果你想绕过 APIKit 异常块中的 statusCode 属性,你应该有另一个 exceptionStrategy 块来捕获你想要的异常,然后你可以像这样设置你的状态码

      <set-property name="http.status" value="<the_desired_status, e.g. 401>" />
      

      希望对你有帮助。

      /托尼

      【讨论】:

        【解决方案4】:

        斯坦尼斯拉夫·伊万诺夫好,

        我有一个使用 APIKit 实现的流程,这是我附加的代码以及 inboundProperties http.status 中是否有属性,请查看它,因为它是否应该包含该值,如果您没有您的流程可能会修改上一步中的值。

        我让他直接访问mapper中的outboundProperties,我不知道,非常感谢。

        【讨论】:

        • 如果有帮助我很高兴!谢谢,周末愉快!
        猜你喜欢
        • 1970-01-01
        • 2016-06-13
        • 2014-03-05
        • 2016-02-18
        • 2020-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-27
        相关资源
        最近更新 更多