我们希望处理我们在异常策略中使用相同进程捕获的所有异常。它是由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>
答案 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)
他的答案几乎是正确的,但是,statusCode不存储在message.inboundProperties [&#39; http.status&#39;]中,而是存储在message.outboundProperties [&#39; http.status&#39; ]。无需提取变量,只需直接在数据转换器中访问它,就像这样:
<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;
答案 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,我不知道,非常感谢你。