From 47b27677439023901e84dd5270b8fb4c2cc9ec60 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Thu, 12 Mar 2026 08:54:05 +0100 Subject: [PATCH] WW-2963 fix(core): resolve default-action-ref via wildcard matching When a default-action-ref points to an action name that only exists as a wildcard pattern (e.g. "movie-input" matching "movie-*"), the framework now falls back to wildcard matching after the exact lookup fails. Port of PR #1614 from Struts 7 to Struts 6.x. Co-Authored-By: Claude Opus 4.6 --- .../config/impl/DefaultConfiguration.java | 3 +++ .../xwork2/config/ConfigurationTest.java | 20 ++++++++++++++++++ core/src/test/resources/xwork-sample.xml | 21 +++++++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java b/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java index a2f73879df..b821f7f88e 100644 --- a/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java +++ b/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java @@ -622,6 +622,9 @@ private ActionConfig findActionConfigInNamespace(String namespace, String name) String defaultActionRef = namespaceConfigs.get(namespace); if (defaultActionRef != null) { config = actions.get(defaultActionRef); + if (config == null) { + config = namespaceActionConfigMatchers.get(namespace).match(defaultActionRef); + } } } } diff --git a/core/src/test/java/com/opensymphony/xwork2/config/ConfigurationTest.java b/core/src/test/java/com/opensymphony/xwork2/config/ConfigurationTest.java index 520f8c2409..d23407b9e5 100644 --- a/core/src/test/java/com/opensymphony/xwork2/config/ConfigurationTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/config/ConfigurationTest.java @@ -338,6 +338,26 @@ public void testPackageExtension() { } + public void testDefaultActionRefWithWildcard() { + RuntimeConfiguration runtimeConfiguration = configurationManager.getConfiguration().getRuntimeConfiguration(); + ActionConfig config = runtimeConfiguration.getActionConfig("/wildcard-default", "unmatchedAction"); + assertNotNull("Wildcard default action ref should resolve via wildcard matching", config); + assertEquals("com.opensymphony.xwork2.SimpleAction", config.getClassName()); + } + + public void testDefaultActionRefWithExactMatch() { + RuntimeConfiguration runtimeConfiguration = configurationManager.getConfiguration().getRuntimeConfiguration(); + ActionConfig config = runtimeConfiguration.getActionConfig("/exact-default", "unmatchedAction"); + assertNotNull("Exact default action ref should resolve via exact matching", config); + assertEquals("com.opensymphony.xwork2.SimpleAction", config.getClassName()); + } + + public void testDefaultActionRefWithWildcardNoMatch() { + RuntimeConfiguration runtimeConfiguration = configurationManager.getConfiguration().getRuntimeConfiguration(); + ActionConfig config = runtimeConfiguration.getActionConfig("/wildcard-default-nomatch", "unmatchedAction"); + assertNull("Default action ref with no matching action should return null", config); + } + @Override protected void setUp() throws Exception { super.setUp(); diff --git a/core/src/test/resources/xwork-sample.xml b/core/src/test/resources/xwork-sample.xml index 4e62f4c12a..c2b17e154b 100644 --- a/core/src/test/resources/xwork-sample.xml +++ b/core/src/test/resources/xwork-sample.xml @@ -295,5 +295,26 @@ + + + + /movie/{1}.jsp + + + + + + + /home.jsp + + + + + + + /movie/{1}.jsp + + +