簡體   English   中英

Spring-integration ExpressionEvaluatingRequestHandlerAdvice 無法評估 failureExpression

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM