Saya punya masalah dengan satu kasus di Mule 3.9. Saya membuat API saya dengan file .this .raml. Salah satu titik akhir hanyalah GET dengan rute "/" (untuk tujuan pengujian). Dalam aliran ini (mengelola GET /) saya ingin memanggil aliran lain untuk memeriksa sth (Dalam kasus saya validasi JWT). Jika valid, saya ingin meneruskan, dan mengembalikan muatan asal. Jika tidak valid, saya memanggil pengecualian di Groovy, yang memang terjadi, tetapi bagaimanapun juga, ini berasal dari payload asal yang sama, yang seharusnya tidak terlihat.
Mari kita buat beberapa kode:
aliran asal:
<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>
dan referensi aliran:
<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>
Dan meskipun token ini sebenarnya tidak valid, saya mendapatkan muatan yang sama dengan teks "API BERFUNGSI". Yang ingin saya lakukan adalah menangkap pengecualian dan mengembalikan HTTP ERROR. Tidak ada lagi.
Saya melampirkan Strategi Pengecualian saya juga. Harap diingat, ini berbasis di APIKIT, menghasilkan file .raml Mule saya sendiri.
<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>
Seluruh API digunakan oleh APIKIT My Mule dengan Strategi Pengecualian Tangkapan Global.
Tolong bantu saya teman-teman.