У меня проблема с одним корпусом в Mule 3.9. У меня есть API, созданный с помощью файла .this .raml. Одна из конечных точек - это просто GET с маршрутом "/" (для целей тестирования). В этом потоке (управление GET/) я хотел бы вызвать другой поток для проверки sth (в моем случае проверка JWT). Когда это действительно, я хотел бы передать и вернуть полезную нагрузку источника. Когда недействительно, я вызываю исключение в Groovy, что действительно происходит, но ведь речь идет об одной и той же исходной полезной нагрузке, которая не должна быть видна.
Давайте сделаем код:
Исходный поток:
<flow-ref name="validate_jwt_token" doc:name="Validate JWT"/>
<set-payload value=" { "message" : "API is working!"}" doc:name="Set Payload" mimeType="application/json" />
</flow>
И ссылка на поток:
<flow name="validate_jwt_token">
<logger message="Request found with Authorization: #[message.inboundProperties['authorization']]" level="INFO" doc:name="Loger Authorization"/>
<component doc:name="Validate JWT Token">
<spring-object bean="ValidateJWTEvent"/>
</component>
<choice doc:name="Choice">
<when expression="(payload == true)">
<logger message="JWT valid. Access granted." level="INFO" doc:name="Logger"/>
</when>
<otherwise>
<scripting:component doc:name="Throw Exception">
<scripting:script engine="Groovy"><![CDATA[throw new Exception('Invalid JWT Token.')]]></scripting:script>
</scripting:component>
</otherwise>
</choice>
<catch-exception-strategy doc:name="Catch Exception Strategy">
<set-property propertyName="http.status" value="401" doc:name="Set 401 status"/>
<flow-ref name="commons.exceptionStrategy.logError" doc:name="Log errors"/>
</catch-exception-strategy>
</flow>
И даже если этот токен на самом деле недействителен, я получаю ту же полезную нагрузку с текстом «API IS WORKING». Что я хочу сделать, так это поймать исключение и вернуть HTTP ERROR. Больше ничего.
Я также прилагаю свою Exception-Strategy. Пожалуйста, имейте в виду, что он основан на APIKIT, сгенерированном моим Mule файлом .raml.
<sub-flow name="commons.exceptionStrategy.logError">
<logger message="Error: #[exception.?cause.message or exception]" level="ERROR" doc:name="Logger" />
<set-property propertyName="Content-Type" value="application/json" doc:name="Set Content Type"/>
<flow-ref name="log_params" doc:name="log_params"/>
<logger message="#[org.apache.commons.lang3.StringEscapeUtils.escapeJson(exception.?getCauseException().?getMessage())]" level="ERROR" doc:name="Display error"/>
<set-payload value="{ "responseHeader": { "requestId": "#[flowVars.storedRequestId]", "sendDate": "#[function:now]"}, "code": "#[flowVars.'statusCode']", "message": "#[flowVars.errorMessage or org.apache.commons.lang3.StringEscapeUtils.escapeJson(exception.?getCauseException().?getMessage())]" }" doc:name="Set Error Message"/>
</sub-flow>
<sub-flow name="log_params">
<logger message="API| endpoint executed with payload: #[message.payload]" level="INFO" doc:name="log payload"/>
<logger message="API| endpoint executed with flowVars: #[flowVars]" level="INFO" doc:name="log params"/>
</sub-flow>
Весь API используется APIKIT my Mule со стратегией Global Catch Exception.
Пожалуйста, помогите мне, ребята.
1 ответ
Похоже, вы ловите исключение в том же потоке, в котором вы его выбрасываете. Поэтому оно не распространяется и поток не прерывается, так как исключение обрабатывается. Вместо этого попробуйте использовать стратегию исключения отката, которая изменит полезную нагрузку, но распространит исключение на ссылку потока вызывающей стороны и прервет этот поток. ХТН
Похожие вопросы
Новые вопросы
exception
Исключением является необычное условие, которое требует отклонения от нормального потока программы. Обычно исключение не должно приводить к полному отказу, а должно сопровождаться обработчиком исключения. Обработка исключений является встроенной конструкцией во многих языках программирования. Обычно исключения обрабатываются путем разматывания стека, что приводит к откату до определенного состояния вне области действия исключения, а затем вызывает блок или процедуру-обработчик.