Fix argument conversion in QuerydslPredicateBuilder.

We now consider the correct argument type instead of checking assignability of the actual property type against the input value.

Closes: #2649
Original Pull Request: #2650
This commit is contained in:
Mark Paluch
2022-06-28 10:00:27 +02:00
committed by Christoph Strobl
parent d25fd39974
commit 9e94e110e4
2 changed files with 20 additions and 8 deletions

View File

@@ -175,30 +175,29 @@ public class QuerydslPredicateBuilder {
*/
private Collection<Object> convertToPropertyPathSpecificType(List<?> source, PathInformation path) {
Class<?> targetType = path.getLeafType();
if (source.isEmpty() || isSingleElementCollectionWithEmptyItem(source)) {
return Collections.emptyList();
}
TypeDescriptor targetType = getTargetTypeDescriptor(path);
Collection<Object> target = new ArrayList<>(source.size());
for (Object value : source) {
target.add(getValue(path, targetType, value));
target.add(getValue(targetType, value));
}
return target;
}
@Nullable
private Object getValue(PathInformation path, Class<?> targetType, Object value) {
private Object getValue(TypeDescriptor targetType, Object value) {
if (ClassUtils.isAssignableValue(targetType, value)) {
if (ClassUtils.isAssignableValue(targetType.getType(), value)) {
return value;
}
if (conversionService.canConvert(value.getClass(), targetType)) {
return conversionService.convert(value, TypeDescriptor.forObject(value), getTargetTypeDescriptor(path));
if (conversionService.canConvert(value.getClass(), targetType.getType())) {
return conversionService.convert(value, TypeDescriptor.forObject(value), targetType);
}
return value;