diff --git a/spring-core/src/main/java/org/springframework/core/io/support/PathMatchingResourcePatternResolver.java b/spring-core/src/main/java/org/springframework/core/io/support/PathMatchingResourcePatternResolver.java index 6a81602871d..1ead45e040b 100644 --- a/spring-core/src/main/java/org/springframework/core/io/support/PathMatchingResourcePatternResolver.java +++ b/spring-core/src/main/java/org/springframework/core/io/support/PathMatchingResourcePatternResolver.java @@ -1294,6 +1294,16 @@ public class PathMatchingResourcePatternResolver implements ResourcePatternResol static ClassPathManifestEntry of(File file, @Nullable Boolean useCaches) throws MalformedURLException { String path = fixPath(file.getAbsolutePath()); Resource resource = asJarFileResource(path, useCaches); + if (!resource.exists()) { + String encodedPath = fixPath(StringUtils.replace(file.getAbsolutePath(), "%", "%25")); + if (!encodedPath.equals(path)) { + Resource encodedResource = asJarFileResource(encodedPath, useCaches); + if (encodedResource.exists()) { + path = encodedPath; + resource = encodedResource; + } + } + } Resource alternative = createAlternative(path, useCaches); return new ClassPathManifestEntry(resource, alternative); } @@ -1316,7 +1326,7 @@ public class PathMatchingResourcePatternResolver implements ResourcePatternResol */ private static @Nullable Resource createAlternative(String path, @Nullable Boolean useCaches) { try { - String alternativePath = path.startsWith("/") ? path.substring(1) : "/" + path; + String alternativePath = (path.startsWith("/") ? path.substring(1) : "/" + path); return asJarFileResource(alternativePath, useCaches); } catch (MalformedURLException ex) { diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/SimplePropertyRowMapper.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/SimplePropertyRowMapper.java index 84b00cf21b3..5b40d3ce1ce 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/SimplePropertyRowMapper.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/SimplePropertyRowMapper.java @@ -130,12 +130,12 @@ public class SimplePropertyRowMapper implements RowMapper { String name = this.constructorParameterNames[i]; int index; try { - // Try direct name match first - index = rs.findColumn(name); + // Try common underscored name match first + index = rs.findColumn(JdbcUtils.convertPropertyNameToUnderscoreName(name)); } catch (SQLException ex) { - // Try underscored name match instead - index = rs.findColumn(JdbcUtils.convertPropertyNameToUnderscoreName(name)); + // Try direct name match (typically with camelCase) instead + index = rs.findColumn(name); } TypeDescriptor td = this.constructorParameterTypes[i]; Object value = JdbcUtils.getResultSetValue(rs, index, td.getType());