Close

Spring - ConditionalGenericConverter

[Last Updated: Oct 26, 2025]

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
}
1Should the conversion from sourceType to targetType currently under consideration be selected?

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);
  }
}

Output

converting :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);
}
}

Output

org.springframework.core.convert.support.ArrayToArrayConverter
org.springframework.core.convert.support.ArrayToCollectionConverter
org.springframework.core.convert.support.ArrayToObjectConverter
org.springframework.core.convert.support.ArrayToStringConverter
org.springframework.core.convert.support.ByteBufferConverter
org.springframework.core.convert.support.CollectionToArrayConverter
org.springframework.core.convert.support.CollectionToCollectionConverter
org.springframework.core.convert.support.CollectionToObjectConverter
org.springframework.core.convert.support.CollectionToStringConverter
org.springframework.core.convert.support.FallbackObjectToStringConverter
org.springframework.core.convert.support.IdToEntityConverter
org.springframework.core.convert.support.MapToMapConverter
org.springframework.core.convert.support.ObjectToArrayConverter
org.springframework.core.convert.support.ObjectToCollectionConverter
org.springframework.core.convert.support.ObjectToObjectConverter
org.springframework.core.convert.support.ObjectToOptionalConverter
org.springframework.core.convert.support.StreamConverter
org.springframework.core.convert.support.StringToArrayConverter
org.springframework.core.convert.support.StringToCollectionConverter

Example Project

Dependencies and Technologies Used:

  • spring-context 6.2.12 (Spring Context)
     Version Compatibility: 4.0.7.RELEASE - 6.2.12Version List
    ×

    Version compatibilities of spring-context with this example:

    • 4.0.7.RELEASE
    • 4.0.8.RELEASE
    • 4.0.9.RELEASE
    • 4.1.0.RELEASE
    • 4.1.1.RELEASE
    • 4.1.2.RELEASE
    • 4.1.3.RELEASE
    • 4.1.4.RELEASE
    • 4.1.5.RELEASE
    • 4.1.6.RELEASE
    • 4.1.7.RELEASE
    • 4.1.8.RELEASE
    • 4.1.9.RELEASE
    • 4.2.0.RELEASE
    • 4.2.1.RELEASE
    • 4.2.2.RELEASE
    • 4.2.3.RELEASE
    • 4.2.4.RELEASE
    • 4.2.5.RELEASE
    • 4.2.6.RELEASE
    • 4.2.7.RELEASE
    • 4.2.8.RELEASE
    • 4.2.9.RELEASE
    • 4.3.0.RELEASE
    • 4.3.1.RELEASE
    • 4.3.2.RELEASE
    • 4.3.3.RELEASE
    • 4.3.4.RELEASE
    • 4.3.5.RELEASE
    • 4.3.6.RELEASE
    • 4.3.7.RELEASE
    • 4.3.8.RELEASE
    • 4.3.9.RELEASE
    • 4.3.10.RELEASE
    • 4.3.11.RELEASE
    • 4.3.12.RELEASE
    • 4.3.13.RELEASE
    • 4.3.14.RELEASE
    • 4.3.15.RELEASE
    • 4.3.16.RELEASE
    • 4.3.17.RELEASE
    • 4.3.18.RELEASE
    • 4.3.19.RELEASE
    • 4.3.20.RELEASE
    • 4.3.21.RELEASE
    • 4.3.22.RELEASE
    • 4.3.23.RELEASE
    • 4.3.24.RELEASE
    • 4.3.25.RELEASE
    • 4.3.26.RELEASE
    • 4.3.27.RELEASE
    • 4.3.28.RELEASE
    • 4.3.29.RELEASE
    • 4.3.30.RELEASE
    • 5.0.0.RELEASE
    • 5.0.1.RELEASE
    • 5.0.2.RELEASE
    • 5.0.3.RELEASE
    • 5.0.4.RELEASE
    • 5.0.5.RELEASE
    • 5.0.6.RELEASE
    • 5.0.7.RELEASE
    • 5.0.8.RELEASE
    • 5.0.9.RELEASE
    • 5.0.10.RELEASE
    • 5.0.11.RELEASE
    • 5.0.12.RELEASE
    • 5.0.13.RELEASE
    • 5.0.14.RELEASE
    • 5.0.15.RELEASE
    • 5.0.16.RELEASE
    • 5.0.17.RELEASE
    • 5.0.18.RELEASE
    • 5.0.19.RELEASE
    • 5.0.20.RELEASE
    • 5.1.0.RELEASE
    • 5.1.1.RELEASE
    • 5.1.2.RELEASE
    • 5.1.3.RELEASE
    • 5.1.4.RELEASE
    • 5.1.5.RELEASE
    • 5.1.6.RELEASE
    • 5.1.7.RELEASE
    • 5.1.8.RELEASE
    • 5.1.9.RELEASE
    • 5.1.10.RELEASE
    • 5.1.11.RELEASE
    • 5.1.12.RELEASE
    • 5.1.13.RELEASE
    • 5.1.14.RELEASE
    • 5.1.15.RELEASE
    • 5.1.16.RELEASE
    • 5.1.17.RELEASE
    • 5.1.18.RELEASE
    • 5.1.19.RELEASE
    • 5.1.20.RELEASE
    • 5.2.0.RELEASE
    • 5.2.1.RELEASE
    • 5.2.2.RELEASE
    • 5.2.3.RELEASE
    • 5.2.4.RELEASE
    • 5.2.5.RELEASE
    • 5.2.6.RELEASE
    • 5.2.7.RELEASE
    • 5.2.8.RELEASE
    • 5.2.9.RELEASE
    • 5.2.10.RELEASE
    • 5.2.11.RELEASE
    • 5.2.12.RELEASE
    • 5.2.13.RELEASE
    • 5.2.14.RELEASE
    • 5.2.15.RELEASE
    • 5.2.16.RELEASE
    • 5.2.17.RELEASE
    • 5.2.18.RELEASE
    • 5.2.19.RELEASE
    • 5.2.20.RELEASE
    • 5.2.21.RELEASE
    • 5.2.22.RELEASE
    • 5.2.23.RELEASE
    • 5.2.24.RELEASE
    • 5.2.25.RELEASE
    • 5.3.0
    • 5.3.1
    • 5.3.2
    • 5.3.3
    • 5.3.4
    • 5.3.5
    • 5.3.6
    • 5.3.7
    • 5.3.8
    • 5.3.9
    • 5.3.10
    • 5.3.11
    • 5.3.12
    • 5.3.13
    • 5.3.14
    • 5.3.15
    • 5.3.16
    • 5.3.17
    • 5.3.18
    • 5.3.19
    • 5.3.20
    • 5.3.21
    • 5.3.22
    • 5.3.23
    • 5.3.24
    • 5.3.25
    • 5.3.26
    • 5.3.27
    • 5.3.28
    • 5.3.29
    • 5.3.30
    • 5.3.31
    • 5.3.32
    • 5.3.33
    • 5.3.34
    • 5.3.35
    • 5.3.36
    • 5.3.37
    • 5.3.38
    • 5.3.39
    • Compatible Java Version: 17+
    • 6.0.0
    • 6.0.1
    • 6.0.2
    • 6.0.3
    • 6.0.4
    • 6.0.5
    • 6.0.6
    • 6.0.7
    • 6.0.8
    • 6.0.9
    • 6.0.10
    • 6.0.11
    • 6.0.12
    • 6.0.13
    • 6.0.14
    • 6.0.15
    • 6.0.16
    • 6.0.17
    • 6.0.18
    • 6.0.19
    • 6.0.20
    • 6.0.21
    • 6.0.22
    • 6.0.23
    • 6.1.0
    • 6.1.1
    • 6.1.2
    • 6.1.3
    • 6.1.4
    • 6.1.5
    • 6.1.6
    • 6.1.7
    • 6.1.8
    • 6.1.9
    • 6.1.10
    • 6.1.11
    • 6.1.12
    • 6.1.13
    • 6.1.14
    • 6.1.15
    • 6.1.16
    • 6.1.17
    • 6.1.18
    • 6.1.19
    • 6.1.20
    • 6.1.21
    • 6.2.0
    • 6.2.1
    • 6.2.2
    • 6.2.3
    • 6.2.4
    • 6.2.5
    • 6.2.6
    • 6.2.7
    • 6.2.8
    • 6.2.9
    • 6.2.10
    • 6.2.11
    • 6.2.12

    Versions in green have been tested.

  • JDK 25
  • Maven 3.8.1

Understanding ConditionalGenericConverter Select All Download
  • spring-conditional-generic-converter-example
    • src
      • main
        • java
          • com
            • logicbig
              • example
                • NumberToBigDecimalConverter.java

    See Also