-
Notifications
You must be signed in to change notification settings - Fork 236
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
An action without parameters results in NoSuchMethodException starting with Spring Framework 6.2.0-M1 #1802
Comments
Thanks for the report. Could you extract a small reproducer? |
This commit adds a GHA workflow that builds the project against a list of configurable Spring Framework versions. The build action has been updated to accept an additional input that tunes the Spring Framework version the build is using As a result, the default Spring Framework version of the project is now configured in gradle.properties. Closes gh-1802
In 6.0, the method is called successfully via SpEL, but in 6.2 the same expression does not return a value, and Web Flow tries the overloaded method signature with a It does work with parenthesis, i.e. "existingReportActions.evaluateExistingReport()". |
This changed in 6.2.0-M1. I cannot reproduce it in 6.1.x. I have not yet narrowed it down to a specific change, but suspect it is expected, and we may just have to document it as an upgrade note. |
I'm currently investigating whether we can support the previous use case in Spring Web Flow, but in the interim I can provide my initial findings here. Basically, there are two different SpEL features that come into play here.
Thus, adding the Without the If the However, if the I believe the change in behavior (switch from In other words, I believe the behavior with Spring Framework 6.2 is the expected behavior in terms of SpEL contracts, and I believe those fixes/improvements in SpEL highlight something that maybe never should have worked in Spring Web Flow with the current implementations of I will attempt to confirm that last statement and report back here. |
I confirmed that. Cause of the ErrorThe current implementation of
Thus, ExplanationPrior to Spring Framework 6.2, SpEL incorrectly sorted the applicable The effect of that is that an expression such as Beginning with Spring Framework 6.2, SpEL correctly sorts the applicable The effect of that is that an expression such as
|
Prior to this commit, if a Spring Expression Language (SpEL) expression did not include parentheses for a MultiAction method that does not accept a RequestContext argument, the flow would pass on Spring Framework versions prior to 6.2, but the same flow would fail on Spring Framework 6.2 M1 or later. The following is such an expression and is effectively a property reference which must be handled by a registered PropertyAccessor: "reportActions.evaluateReport". The reason for the change in behavior is that Spring Framework 6.2 M1 includes a bug fix for ordering SpEL PropertyAccessors. That bug fix correctly results in Spring Web Flow's ActionPropertyAccessor being evaluated before SpEL's ReflectivePropertyAccessor. Consequently, an expression such as "reportActions.evaluateReport" is now handled by ActionPropertyAccessor which indirectly requires that the action method accept a RequestContext argument. When the method does not accept a RequestContext argument, the flow fails with a NoSuchMethodException. To address that, this commit revises the implementation of canRead(...) in ActionPropertyAccessor so that it only returns `true` if the action method accepts a RequestContext argument. When ActionPropertyAccessor's canRead(...) method returns `false`, the generic ReflectivePropertyAccessor will be used instead, which restores the pre-6.2 behavior for such expressions. The test suite passes for the following Spring Framework versions. - ./gradlew -PspringFrameworkVersion=6.0.23 --rerun-tasks clean check - ./gradlew -PspringFrameworkVersion=6.1.14 --rerun-tasks clean check - ./gradlew -PspringFrameworkVersion=6.2.0-RC3 --rerun-tasks clean check See spring-projects/spring-framework#33861 See spring-projects/spring-framework#33862 Closes spring-projectsgh-1802
Superseded by #1819. |
Long-established app. uses Webflow 3.0.0.
Thought I'd try the upgrade to Framework 6.2.0-SNAPSHOT...see what breaks.
This code broke:
Rectified by supplying the 'missing' RequestContext parameter explicitly:
The flow xml remains as:
Eliding the RequestContext parameter used to be allowable. It appears that it no longer is.
A fairly trivial difference, but a breaking one nonetheless.
The text was updated successfully, but these errors were encountered: