mirror of
https://github.com/spring-projects/spring-framework.git
synced 2026-09-17 08:24:13 +00:00
ReflectivePropertyAccessor's canRead(), read(), and canWrite() methods previously constructed org.springframework.core.convert.Property instances without an explicit name, forcing Property#resolveName() to re-derive the property name from the accessor method via prefix matching. That heuristic incorrectly resolves record-style and other prefix-less accessor methods whose names embed or start with "get"/"is" (for example, budget(), issue(), or island()), and it also normalizes acronym-style JavaBean properties inconsistently (for example, getURL() resolves to "uRL" rather than "URL"). By the time these three methods construct a Property, they have already located the accessor method by searching for exactly the requested property name, so the resolved name is already known and verified. This commit passes that name through explicitly via the 4-arg Property constructor, bypassing Property#resolveName() entirely at these call sites. This commit also introduces tests in PropertyAccessTests to cover the following scenarios: - A genuine record accessor whose component name embeds or starts with a "get"/"is" prefix - The same scenario on a hand-written, non-record "data class" - The read() call site exercised directly, since it is otherwise unreachable once canRead() has warmed the cache - A boolean isXxx() getter, as a plain regression check - An acronym-style property with a decoy field to prove that the correct field (and its annotations) is now resolved for both reads and writes See gh-36911 Closes gh-37123