use of org.jdbi.v3.core.mapper.reflect.ColumnName in project jdbi by jdbi.
the class PojoBuilderUtils method findBuilderSetter.
public static MethodHandle findBuilderSetter(final Class<?> builderClass, String name, Method decl, Type type) throws IllegalAccessException {
final List<NoSuchMethodException> failures = new ArrayList<>();
final Set<String> names = new LinkedHashSet<>();
names.add(PojoBuilderUtils.defaultSetterName(decl.getName()));
names.add(name);
if (name.length() > 1) {
names.addAll(setterNames(name));
}
ColumnName columnName = decl.getAnnotation(ColumnName.class);
if (columnName != null && columnName.value().equals(name)) {
names.addAll(setterNames(PojoBuilderUtils.defaultSetterName(decl.getName())));
}
for (String tryName : names) {
try {
return MethodHandles.lookup().unreflect(builderClass.getMethod(tryName, GenericTypes.getErasedType(type)));
} catch (NoSuchMethodException e) {
failures.add(e);
}
}
for (Method m : builderClass.getMethods()) {
if (names.contains(m.getName()) && m.getParameterCount() == 1) {
return MethodHandles.lookup().unreflect(m);
}
}
final IllegalArgumentException iae = new IllegalArgumentException("Failed to find builder setter for property " + name + " on " + builderClass);
failures.forEach(iae::addSuppressed);
return MethodHandles.dropArguments(MethodHandles.throwException(Object.class, IllegalArgumentException.class), 1, Arrays.asList(Object.class, Object.class)).bindTo(iae);
}
use of org.jdbi.v3.core.mapper.reflect.ColumnName in project jdbi by jdbi.
the class ConstructorMapper method specialize0.
private RowMapper<T> specialize0(ResultSet rs, StatementContext ctx, List<String> columnNames, List<ColumnNameMatcher> columnNameMatchers, List<String> unmatchedColumns) throws SQLException {
final int count = constructor.getParameterCount();
final Parameter[] parameters = constructor.getParameters();
final RowMapper<?>[] mappers = new RowMapper<?>[count];
for (int i = 0; i < count; i++) {
final Parameter parameter = parameters[i];
Nested anno = parameter.getAnnotation(Nested.class);
if (anno == null) {
final String paramName = prefix + paramName(parameters, i, constructorProperties);
final int columnIndex = findColumnIndex(paramName, columnNames, columnNameMatchers, () -> debugName(parameter)).orElseThrow(() -> new IllegalArgumentException(String.format("Constructor '%s' parameter '%s' has no column in the result set. " + "Verify that the Java compiler is configured to emit parameter names, " + "that your result set has the columns expected, or annotate the " + "parameter names explicitly with @ColumnName", constructor, paramName)));
final Type type = parameter.getParameterizedType();
mappers[i] = ctx.findColumnMapperFor(type).map(mapper -> new SingleColumnMapper(mapper, columnIndex + 1)).orElseThrow(() -> new IllegalArgumentException(String.format("Could not find column mapper for type '%s' of parameter '%s' for constructor '%s'", type, paramName, constructor)));
unmatchedColumns.remove(columnNames.get(columnIndex));
} else {
String nestedPrefix = prefix + anno.value();
mappers[i] = nestedMappers.computeIfAbsent(parameter, p -> new ConstructorMapper<>(findConstructorFor(p.getType()), nestedPrefix)).specialize0(rs, ctx, columnNames, columnNameMatchers, unmatchedColumns);
}
}
return (r, c) -> {
final Object[] params = new Object[count];
for (int i = 0; i < count; i++) {
params[i] = mappers[i].map(r, c);
}
return construct(params);
};
}
Aggregations