在Spelexception的情况下,ExpressionValuatingRequestHandlerAdvice将消



我在此线程的评论部分中提出了一些疑问。

在调试应用程序时,我注意到一些可能的代码错误。它们是错误还是功能?

  1. ExpressionEvaluatingRequestHandlerAdvice::evaluateSuccessExp‌​ression中,将AdviceMessage发送到SuccessChannel之后,抛出了例外。这会导致IT上的异常有效载荷。如果有一个方法,该方法不应该先引发异常吗?
  2. 在同一类中,propagateOnSuccessEvaluationFailures默认为" false",这导致不引发异常。那否定了FailChannel的目的。我将其设置为"真实"。您能解释一下这些背后的思考过程吗?

加里已经回答,

我不明白您的观点1。对于点2.,通常,错误处理程序处理错误,并且无需呼叫者知道存在问题。如果有的话,通常,错误处理程序流应该会引发新的例外,以向呼叫者指示错误处理程序已涉及的。布尔值适用于您要处理错误并将原始异常的罕见实例。

我们可以讨论此处的点。

我认为点2的解释适用于trapException

为了清楚我的观点,我复制了ExpressionEvaluatingRequestHandlerAdvice的一部分。

protected Object doInvoke(ExecutionCallback callback, Object target, Message<?> message) throws Exception {
        try {
            Object e = callback.execute();
            if(this.onSuccessExpression != null) {
                this.evaluateSuccessExpression(message);
            }
            return e;
        } catch (Exception var7) {
            Exception actualException = this.unwrapExceptionIfNecessary(var7);
            if(this.onFailureExpression != null) {
                Object evalResult = this.evaluateFailureExpression(message, actualException);
                if(this.returnFailureExpressionResult) {
                    return evalResult;
                }
            }
            if(!this.trapException) {
                throw actualException;
            } else {
                return null;
            }
        }
    }
    private void evaluateSuccessExpression(Message<?> message) throws Exception {
        boolean evaluationFailed = false;
        Object evalResult;
        try {
            evalResult = this.onSuccessExpression.getValue(this.prepareEvaluationContextToUse((Exception)null), message);
        } catch (Exception var5) {
            evalResult = var5;
            evaluationFailed = true;
        }
        if(this.successChannel == null && this.successChannelName != null && this.getChannelResolver() != null) {
            this.successChannel = (MessageChannel)this.getChannelResolver().resolveDestination(this.successChannelName);
        }
        if(evalResult != null && this.successChannel != null) {
            AdviceMessage resultMessage = new AdviceMessage(evalResult, message);
            this.messagingTemplate.send(this.successChannel, resultMessage);
        }
        if(evaluationFailed && this.propagateOnSuccessEvaluationFailures) {
            throw (Exception)evalResult;
        }
    }
    private Object evaluateFailureExpression(Message<?> message, Exception exception) throws Exception {
        Object evalResult;
        try {
            evalResult = this.onFailureExpression.getValue(this.prepareEvaluationContextToUse(exception), message);
        } catch (Exception var6) {
            evalResult = var6;
            this.logger.error("Failure expression evaluation failed for " + message + ": " + var6.getMessage());
        }
        if(this.failureChannel == null && this.failureChannelName != null && this.getChannelResolver() != null) {
            this.failureChannel = (MessageChannel)this.getChannelResolver().resolveDestination(this.failureChannelName);
        }
        if(evalResult != null && this.failureChannel != null) {
            ExpressionEvaluatingRequestHandlerAdvice.MessageHandlingExpressionEvaluatingAdviceException messagingException = new ExpressionEvaluatingRequestHandlerAdvice.MessageHandlingExpressionEvaluatingAdviceException(message, "Handler Failed", this.unwrapThrowableIfNecessary(exception), evalResult);
            ErrorMessage resultMessage = new ErrorMessage(messagingException);
            this.messagingTemplate.send(this.failureChannel, resultMessage);
        }
        return evalResult;
    }

doInvoke中,如果callback.execute()evaluateSuccessExpression抛出异常。

现在在evaluateSuccessExpression中,如果在评估SuccessExpression时存在任何错误,则该异常存储在evalResult中。如果配置了SuccessChannel,则将其发送到CC_15。如果将propagateOnSuccessEvaluationFailures设置为true,则仅evaluateSuccessExpression引发错误。由于默认情况下将其设置为" false",因此evalResult不会抛出,因此不会被evaluateFailureExpression捕获。

即使需要根据其他要求将propagateOnSuccessEvaluationFailures设置为" false",在将结果发送到SuccessChannel之前,应进行例外的支票。

我认为您有重点。请对此事提出一个JIRA,我们将修改逻辑的块。总的来说,我同意最好先检查Rethrow,并且仅在此之后将该例外发送给successChannel

不幸的是,没有解决方法(除非您自己的解决方案),并且我们无法立即修复它,因为它将改变行为 - 有人可能真的依靠此状态。

我什至认为我们可以修改propagateOnSuccessEvaluationFailures的默认值,因为您在这里也有意见。但是再次:我们只能在下一个5.1版本中进行。

相关内容

  • 没有找到相关文章

最新更新