如何从Mule中的ApiKit映射中检索statusCode

时间:2016-07-07 14:58:26

标签: mule mule-component anypoint-studio

我们希望处理我们在异常策略中使用相同进程捕获的所有异常。它是由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>

4 个答案:

答案 0 :(得分:2)

好,

如果使用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>

答案 1 :(得分:2)

由于Jesús Pablo Fernández

的回答,我发现了statusCode值的存储位置

他的答案几乎是正确的,但是,statusCode不存储在message.inboundProperties [&#39; http.status&#39;]中,而是存储在message.outboundProperties [&#39; http.status&#39; ]。无需提取变量,只需直接在数据转换器中访问它,就像这样:

&#13;
&#13;
        <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>
&#13;
&#13;
&#13;

答案 2 :(得分:0)

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>" />

希望它有所帮助。

/托尼

答案 3 :(得分:0)

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

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

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