Skip to content

Commit 7c2942e

Browse files
committed
Reflectively invoke RowMetadata.getColumnMetadatas.
We now use reflection to call RowMetadata.getColumnMetadatas to avoid NoSuchMethodError when using R2DBC 0.9 as the return type has changed in newer R2DBC versions. Closes #699
1 parent 7bd27c6 commit 7c2942e

File tree

2 files changed

+30
-2
lines changed

2 files changed

+30
-2
lines changed

src/main/java/org/springframework/data/r2dbc/convert/MappingR2dbcConverter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,7 @@ private Object extractGeneratedIdentifier(Row row, RowMetadata metadata, String
647647
return row.get(idColumnName);
648648
}
649649

650-
Iterable<? extends ColumnMetadata> columns = metadata.getColumnMetadatas();
650+
Iterable<? extends ColumnMetadata> columns = RowMetadataUtils.getColumnMetadata(metadata);
651651
Iterator<? extends ColumnMetadata> it = columns.iterator();
652652

653653
if (it.hasNext()) {

src/main/java/org/springframework/data/r2dbc/convert/RowMetadataUtils.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@
1818
import io.r2dbc.spi.ColumnMetadata;
1919
import io.r2dbc.spi.RowMetadata;
2020

21+
import java.lang.reflect.Method;
22+
23+
import org.springframework.lang.Nullable;
24+
import org.springframework.util.ReflectionUtils;
25+
2126
/**
2227
* Utility methods for {@link io.r2dbc.spi.RowMetadata}
2328
*
@@ -26,6 +31,9 @@
2631
*/
2732
class RowMetadataUtils {
2833

34+
private static final @Nullable Method getColumnMetadatas = ReflectionUtils.findMethod(RowMetadata.class,
35+
"getColumnMetadatas");
36+
2937
/**
3038
* Check whether the column {@code name} is contained in {@link RowMetadata}. The check happens case-insensitive.
3139
*
@@ -35,12 +43,32 @@ class RowMetadataUtils {
3543
*/
3644
public static boolean containsColumn(RowMetadata metadata, String name) {
3745

38-
for (ColumnMetadata columnMetadata : metadata.getColumnMetadatas()) {
46+
Iterable<? extends ColumnMetadata> columns = getColumnMetadata(metadata);
47+
48+
for (ColumnMetadata columnMetadata : columns) {
3949
if (name.equalsIgnoreCase(columnMetadata.getName())) {
4050
return true;
4151
}
4252
}
4353

4454
return false;
4555
}
56+
57+
/**
58+
* Return the {@link Iterable} of {@link ColumnMetadata} from {@link RowMetadata}.
59+
*
60+
* @param metadata the metadata object to inspect.
61+
* @return
62+
* @since 1.4.1
63+
*/
64+
@SuppressWarnings("unchecked")
65+
public static Iterable<? extends ColumnMetadata> getColumnMetadata(RowMetadata metadata) {
66+
67+
if (getColumnMetadatas != null) {
68+
// Return type of RowMetadata.getColumnMetadatas was updated with R2DBC 0.9.
69+
return (Iterable<? extends ColumnMetadata>) ReflectionUtils.invokeMethod(getColumnMetadatas, metadata);
70+
}
71+
72+
return metadata.getColumnMetadatas();
73+
}
4674
}

0 commit comments

Comments
 (0)