2016-07-07 69 views
0

我们想要处理我们在异常策略中使用同一过程捕获的所有异常。它是由apikit生成的。我们首先发送一个自定义组件,然后生成json响应。在DataWeave的响应中,我们希望设置相同的statusCode。但是,statusCode似乎不是可检索的变量。我是否正确,还是有一个很好的方法来检索它?如何从Mule中的ApiKit映射检索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> 
 
\t \t <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>

回答

2

我发现了其中的StatusCode值存储感谢答案由Jesús Pablo Fernández

他几乎就在他的回答,然而,的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>

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> 
+0

谢谢您的建议,但apieit:mapping statusCode =“value”未在message.inboundProperties ['http.status']中传递,因此以后不能在流中使用。 –

+0

你几乎是正确的,请检查我的答案,再次感谢你! –

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

希望它能帮助。

/托尼

0

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

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

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

+0

如果它有帮助,我很高兴!谢谢你,祝你周末愉快! –