ConditionalGenericConverter
ConditionalGenericConverter is a specialization of GenericConverter.
Definition of ConditionalGenericConverter(Version: spring-framework 6.1.2) package org.springframework.core.convert.converter;
........
public interface ConditionalGenericConverter extends GenericConverter, ConditionalConverter {}
Definition of ConditionalConverter(Version: spring-framework 6.1.2) package org.springframework.core.convert.converter;
........
public interface ConditionalConverter {
boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType); 1
}
It allows to conditionally execute the converter based on the matches() return boolean.
Example
Following conditional converter example converts all Number types to BigDecimal type (as provided by getConvertibleTypes()) except for BigDecimal to BigDecimal (as provided by matches()).
package com.logicbig.example;
import org.springframework.core.convert.TypeDescriptor;
import org.springframework.core.convert.converter.ConditionalGenericConverter;
import java.math.BigDecimal;
import java.util.Collections;
import java.util.Set;
public class NumberToBigDecimalConverter implements ConditionalGenericConverter {
@Override
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
return sourceType.getType() != BigDecimal.class;
}
@Override
public Set<ConvertiblePair> getConvertibleTypes() {
return Collections.singleton(new ConvertiblePair(Number.class,
BigDecimal.class));
}
@Override
public Object convert(Object source, TypeDescriptor sourceType,
TypeDescriptor targetType) {
System.out.println("converting :"+source);
Number number = (Number) source;
return new BigDecimal(number.doubleValue());
}
}
package com.logicbig.example;
import org.springframework.core.convert.support.DefaultConversionService;
import java.math.BigDecimal;
public class ConditionalGenericConverterExample {
public static void main(String[] args) {
DefaultConversionService service = new DefaultConversionService();
service.addConverter(new NumberToBigDecimalConverter());
BigDecimal bd = service.convert(Double.valueOf("2222.336"),
BigDecimal.class);
bd = bd.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("result: " + bd);
System.out.println("----------");
//this will return the same BigDecimal instance without conversion
BigDecimal bd2 = new BigDecimal("898.33");
bd = service.convert(bd2, BigDecimal.class);
System.out.println("result: " + bd);
System.out.println(bd == bd2);
}
}
Outputconverting :2222.336 result: 2222.34 ---------- result: 898.33 true
Built-in conditional generic converters
Following code list all built-in GenericConverter classes:
package com.logicbig.example;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.core.convert.converter.ConditionalGenericConverter;
import org.springframework.core.type.filter.AssignableTypeFilter;
import java.util.Set;
public class SpringBuiltInConditionalGenericConvertersFinder {
public static void main(String[] args) {
ClassPathScanningCandidateComponentProvider provider =
new ClassPathScanningCandidateComponentProvider(false);
provider.addIncludeFilter(new AssignableTypeFilter(ConditionalGenericConverter.class));
Set<BeanDefinition> components = provider.findCandidateComponents("org/springframework");
components.stream()
.map(BeanDefinition::getBeanClassName)
.forEach(System.out::println);
}
}
Outputorg.springframework.core.convert.support.CollectionToArrayConverter org.springframework.core.convert.support.CollectionToObjectConverter org.springframework.core.convert.support.ObjectToCollectionConverter org.springframework.core.convert.support.MapToMapConverter org.springframework.core.convert.support.StringToArrayConverter org.springframework.core.convert.support.CollectionToCollectionConverter org.springframework.core.convert.support.CollectionToStringConverter org.springframework.core.convert.support.FallbackObjectToStringConverter org.springframework.core.convert.support.ArrayToCollectionConverter org.springframework.core.convert.support.ArrayToStringConverter org.springframework.core.convert.support.ObjectToOptionalConverter org.springframework.core.convert.support.ArrayToObjectConverter org.springframework.core.convert.support.StreamConverter org.springframework.core.convert.support.ObjectToArrayConverter org.springframework.core.convert.support.ArrayToArrayConverter org.springframework.core.convert.support.IdToEntityConverter org.springframework.core.convert.support.StringToCollectionConverter org.springframework.core.convert.support.ByteBufferConverter org.springframework.core.convert.support.ObjectToObjectConverter
Example ProjectDependencies and Technologies Used: - spring-context 6.1.2 (Spring Context)
Version Compatibility: 4.0.7.RELEASE - 6.1.2 Version compatibilities of spring-context with this example: Versions in green have been tested.
- JDK 17
- Maven 3.8.1
|