我们希望在我们的异常策略中用相同的进程处理我们捕获的所有异常。它是由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>
发布于 2016-07-08 08:31:55
我发现了statusCode值的存储位置,这要感谢Jesús Pablo Fernández的回答。
然而,他的回答几乎是正确的,但是,statusCode不是存储在message.in界属性‘http.state’中,而是存储在message.out量属性‘http.state’中。甚至不需要提取变量,您只需在数据转换器中直接访问它,如下所示:
<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>
发布于 2016-07-07 15:52:57
好的,
如果使用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>发布于 2016-07-07 16:28:31
在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状态代码将作为响应头发送回。如果您想绕过statusCode异常块中的APIKit属性,则应该有另一个exceptionStrategy块来捕获所需的异常,然后可以像这样设置状态代码。
<set-property name="http.status" value="<the_desired_status, e.g. 401>" />希望能帮上忙。
/Tony
https://stackoverflow.com/questions/38248807
复制相似问题