This is an automated email from the ASF dual-hosted git repository. lukaszlenart pushed a commit to branch WW-5539 in repository https://gitbox.apache.org/repos/asf/struts.git
commit f64a19006a3603f0c4c474f2a7b1127e660d3674 Author: Lukasz Lenart <[email protected]> AuthorDate: Tue Jul 21 17:34:45 2026 +0200 WW-5539 Document that addNoMapping may replace a cached mapping The behaviour was documented only on the Struts implementation, but addNoMapping stays a non-deprecated SPI primitive that third parties both call and implement, so the contract belongs on the interface. Co-Authored-By: Claude Opus 4.8 <[email protected]> --- .../main/java/org/apache/struts2/conversion/TypeConverterHolder.java | 4 +++- .../org/apache/struts2/conversion/StrutsTypeConverterHolderTest.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/apache/struts2/conversion/TypeConverterHolder.java b/core/src/main/java/org/apache/struts2/conversion/TypeConverterHolder.java index 1adfe8a3c..ccfa7d1e1 100644 --- a/core/src/main/java/org/apache/struts2/conversion/TypeConverterHolder.java +++ b/core/src/main/java/org/apache/struts2/conversion/TypeConverterHolder.java @@ -85,7 +85,9 @@ public interface TypeConverterHolder { boolean containsNoMapping(Class clazz); /** - * Adds no mapping flag for give class + * Adds no mapping flag for give class. Flagging a class as having no mapping may replace + * any mapping previously cached for it; callers should treat this flag as authoritative + * over a previously cached mapping. * * @param clazz class to register missing converter */ diff --git a/core/src/test/java/org/apache/struts2/conversion/StrutsTypeConverterHolderTest.java b/core/src/test/java/org/apache/struts2/conversion/StrutsTypeConverterHolderTest.java index 686ab5f4d..b31ff4f93 100644 --- a/core/src/test/java/org/apache/struts2/conversion/StrutsTypeConverterHolderTest.java +++ b/core/src/test/java/org/apache/struts2/conversion/StrutsTypeConverterHolderTest.java @@ -185,7 +185,9 @@ public class StrutsTypeConverterHolderTest extends XWorkTestCase { assertThat(holder.containsNoMapping(String.class)).isTrue(); assertThat(holder.getMapping(String.class)).isNull(); - assertThat(holder.computeMappingIfAbsent(String.class, clazz -> real)).isEmpty(); + assertThat(holder.computeMappingIfAbsent(String.class, clazz -> { + throw new AssertionError("builder must not run when no mapping is set"); + })).isNotNull().isEmpty(); } public void testComputeMappingIfAbsentNegativeCachesNullResult() {
