[英]ExpressionEvaluatingRequestHandlerAdvice Spring Integration
[英]Spring-integration ExpressionEvaluatingRequestHandlerAdvice unable to evaluate the failureExpression
根據我昨天提出的問題,我發現ExpressionEvaluatingRequestHandlerAdvice
存在一些問題,因為它沒有按我的預期工作。
我嘗試了文檔示例,我的期望是得到兩個AdviceMessage
:一個說“好是成功的”,另一個說“壞是壞的,有理由......”但是當我運行代碼時,我得到一個 AdviceMessage 和一個 ErrorMessage。
AdviceMessage [payload=good was successful, headers={id=2eb612ea-d3cd-f853-3295-236505a130f3, timestamp=1611307975199}, inputMessage=GenericMessage [payload=good, headers={id=725e89ea-be09-7534-1b29-5c7412a99a79, timestamp=1611307975196}]]
ErrorMessage [payload=org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice$MessageHandlingExpressionEvaluatingAdviceException: Handler Failed; nested exception is java.lang.IllegalStateException: Could not invoke the method 'public java.lang.Object com.example.demo.EerhaApplication$$Lambda$299/0x00000008401d7040.handle(java.lang.Object,org.springframework.messaging.MessageHeaders)', failedMessage=GenericMessage [payload=bad, headers={id=7639425f-7676-d521-5994-4c74e5b09f4a, timestamp=1611307975200}], headers={id=aaa07286-4bc3-71e5-09fb-6b55a46e0ecf, timestamp=1611307975201}]
顯然,總是拋出一個異常,評估 failureExpression 永遠不會得到想要的結果。
我正在使用 Spring Boot 2.4.2 但我也嘗試過使用舊版本,總是具有相同的行為。
我究竟做錯了什么?
我們需要查看此ExpressionEvaluatingRequestHandlerAdvice
的代碼,但無論如何,僅在成功評估onSuccessExpression
的情況下才會發送AdviceMessage
:
if (evalResult != null && this.successChannel != null) {
AdviceMessage<?> resultMessage = new AdviceMessage<>(evalResult, message);
this.messagingTemplate.send(this.successChannel, resultMessage);
}
當你MessageHandler
失敗時(即使onSuccessExpression
失敗),我們 go 到這個分支:
catch (RuntimeException e) {
Exception actualException = unwrapExceptionIfNecessary(e);
if (this.onFailureExpression != null) {
Object evalResult = evaluateFailureExpression(message, actualException);
if (this.returnFailureExpressionResult) {
return evalResult;
}
}
我們在那里發送一個ErrorMessage
:
if (evalResult != null && this.failureChannel != null) {
MessagingException messagingException =
new MessageHandlingExpressionEvaluatingAdviceException(message, "Handler Failed",
unwrapThrowableIfNecessary(exception), evalResult);
ErrorMessage errorMessage = new ErrorMessage(messagingException);
this.messagingTemplate.send(this.failureChannel, errorMessage);
}
因此,您顯示的實際上是預期的行為。
因此需要查看您的配置並了解您在這兩種情況下的期望。
為了得到字符串“bad was bad, with reason...”打印,這是我的解決方案:
@Bean
public IntegrationFlow failure() {
return f -> f.handle(m -> {
System.out.println(((ExpressionEvaluatingRequestHandlerAdvice.MessageHandlingExpressionEvaluatingAdviceException)m.getPayload()).getEvaluationResult());
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.