From 80acc4ee89828ee4648e04f1e311270295efd2cc Mon Sep 17 00:00:00 2001 From: Naveed Khan Date: Wed, 22 Jul 2026 16:02:56 +0530 Subject: [PATCH 1/2] resolve column name in ResultSetIterator.set the read path resolves the dyna-property name to the real column name via getColumnName, but set passed the raw name to updateObject, so with the default lowerCase a mixed-case column update targeted the wrong column. --- .../beanutils2/sql/ResultSetIterator.java | 2 +- .../beanutils2/sql/DynaResultSetTest.java | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/beanutils2/sql/ResultSetIterator.java b/src/main/java/org/apache/commons/beanutils2/sql/ResultSetIterator.java index 792f2ff2e..53c8859c0 100644 --- a/src/main/java/org/apache/commons/beanutils2/sql/ResultSetIterator.java +++ b/src/main/java/org/apache/commons/beanutils2/sql/ResultSetIterator.java @@ -249,7 +249,7 @@ public void set(final String name, final Object value) { throw new IllegalArgumentException(name); } try { - dynaClass.getResultSet().updateObject(name, value); + dynaClass.getResultSet().updateObject(dynaClass.getColumnName(name), value); } catch (final SQLException e) { throw new IllegalArgumentException("set(" + name + "): SQLException: " + e); } diff --git a/src/test/java/org/apache/commons/beanutils2/sql/DynaResultSetTest.java b/src/test/java/org/apache/commons/beanutils2/sql/DynaResultSetTest.java index c98b7e94d..4ab583e3c 100644 --- a/src/test/java/org/apache/commons/beanutils2/sql/DynaResultSetTest.java +++ b/src/test/java/org/apache/commons/beanutils2/sql/DynaResultSetTest.java @@ -25,6 +25,8 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import java.math.BigDecimal; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.Iterator; import org.apache.commons.beanutils2.DynaBean; @@ -96,6 +98,26 @@ void testGetName() { assertEquals("org.apache.commons.beanutils2.sql.ResultSetDynaClass", dynaClass.getName(), "DynaClass name"); } + /** + * With the default {@code lowerCase} option the property name differs from the real column name, and the read path resolves it through + * {@code getColumnName}. Verify that {@code set} resolves it the same way, so the update targets the real column name and not the lower-cased property + * name. + */ + @Test + void testSetUsesColumnName() throws Exception { + final String[] updatedColumn = new String[1]; + final ResultSet resultSet = TestResultSet.createProxy(new TestResultSet() { + @Override + public void updateObject(final String columnName, final Object value) throws SQLException { + updatedColumn[0] = columnName; + } + }); + final ResultSetDynaClass rsdc = new ResultSetDynaClass(resultSet); + final DynaBean row = rsdc.iterator().next(); + row.set("stringproperty", "new value"); + assertEquals("stringProperty", updatedColumn[0], "update targets the real column name"); + } + @Test void testIteratorCount() { From 69db2a0b064e423cc351651dcfbd4a27d85a6ebf Mon Sep 17 00:00:00 2001 From: Naveed Khan Date: Thu, 23 Jul 2026 21:17:14 +0530 Subject: [PATCH 2/2] use AtomicReference to capture the updated column name in test --- .../apache/commons/beanutils2/sql/DynaResultSetTest.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/test/java/org/apache/commons/beanutils2/sql/DynaResultSetTest.java b/src/test/java/org/apache/commons/beanutils2/sql/DynaResultSetTest.java index 4ab583e3c..73d07a3b7 100644 --- a/src/test/java/org/apache/commons/beanutils2/sql/DynaResultSetTest.java +++ b/src/test/java/org/apache/commons/beanutils2/sql/DynaResultSetTest.java @@ -28,6 +28,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.Iterator; +import java.util.concurrent.atomic.AtomicReference; import org.apache.commons.beanutils2.DynaBean; import org.apache.commons.beanutils2.DynaProperty; @@ -105,17 +106,17 @@ void testGetName() { */ @Test void testSetUsesColumnName() throws Exception { - final String[] updatedColumn = new String[1]; + final AtomicReference updatedColumn = new AtomicReference<>(); final ResultSet resultSet = TestResultSet.createProxy(new TestResultSet() { @Override public void updateObject(final String columnName, final Object value) throws SQLException { - updatedColumn[0] = columnName; + updatedColumn.set(columnName); } }); final ResultSetDynaClass rsdc = new ResultSetDynaClass(resultSet); final DynaBean row = rsdc.iterator().next(); row.set("stringproperty", "new value"); - assertEquals("stringProperty", updatedColumn[0], "update targets the real column name"); + assertEquals("stringProperty", updatedColumn.get(), "update targets the real column name"); } @Test