Close

Spring - Conversion Service

[Last Updated: Dec 22, 2023]

Spring 3 introduced a new type conversion mechanism as an alternative to PropertyEditors.

The disadvantage of JavaBean PropertyEditor is that they are not thread-safe because they directly attempt to modify the JavaBean fields (the instance variables). JavaBeans PropertyEditor was originally designed to be used in single-threaded GUI applications.

A ConversionService is a stateless object so is thread-safe.

Spring provides built in default converters which can do conversion between strings, numbers, enums, collections, maps, and other common types.

In this tutorial we are going to learn the basic use of ConversionService.



Definition of ConversionService

(Version: spring-framework 6.1.2)
package org.springframework.core.convert;
   ........
public interface ConversionService {
    boolean canConvert(@Nullable Class<?> sourceType, Class<?> targetType); 1
    boolean canConvert(@Nullable TypeDescriptor sourceType, TypeDescriptor targetType); 2
    @Nullable
    <T> T convert(@Nullable Object source, Class<T> targetType); 3
    @Nullable
    default Object convert(@Nullable Object source, TypeDescriptor targetType) {
        return convert(source, TypeDescriptor.forObject(source), targetType);
    } 4
    @Nullable
    Object convert(
            @Nullable Object source,
            @Nullable TypeDescriptor sourceType,
            TypeDescriptor targetType); 5
}
1Return true if objects of sourceType can be converted to the targetType. If this method returns true, it means #convert(Object, Class) is capable of converting an instance of sourceType to targetType.
2Return true if objects of sourceType can be converted to the targetType. The TypeDescriptors provide additional context about the source and target locations where conversion would occur, often object fields or property locations.
3Convert the given source to the specified targetType.
4Convert the given source to the specified targetType. Delegates to convert(Object, TypeDescriptor, TypeDescriptor) and encapsulates the construction of the source type descriptor using TypeDescriptor.forObject(Object).
Since: 6.1
5Convert the given source to the specified targetType. The TypeDescriptors provide additional context about the source and target locations where conversion will occur, often object fields or property locations.

ConversionServices basic example

Following example shows a standalone use of ConversionService.
DefaultConversionService is an implementation of ConversionService which registers many converters by default.

package com.logicbig.example;

import org.springframework.core.convert.support.DefaultConversionService;
import java.util.Collection;
import java.util.Currency;

public class ConversionServiceExample {
    public static void main (String[] args) {
        DefaultConversionService service = new DefaultConversionService();

        Currency convert = service.convert("USD", Currency.class);
        System.out.println(convert);

        Collection<String> list = service.convert("Deb, Mike, Kim",
                                                        Collection.class);
        System.out.println(list);
    }
}

Output

USD
[Deb, Mike, Kim]

Converter interface

ConversionService uses various implementations of Converter interfaces to perform conversion.

Definition of Converter

(Version: spring-framework 6.1.2)
package org.springframework.core.convert.converter;
   ........
@FunctionalInterface
public interface Converter<S, T> {
    @Nullable
    T convert(S source); 1
    default <U> Converter<S, U> andThen(Converter<? super T, ? extends U> after) {
        Assert.notNull(after, "'after' Converter must not be null");
        return (S s) -> {
            T initialResult = convert(s);
            return (initialResult != null ? after.convert(initialResult) : null);
        };
    } 2
}
1Convert the source object of type S to target type T.
2Construct a composed Converter that first applies this Converter to its input, and then applies the after Converter to the result.


In next tutorials we will go through various examples to understand ConversionService.



Example Project

Dependencies and Technologies Used:

  • spring-context 6.1.2 (Spring Context)
     Version Compatibility: 4.2.0.RELEASE - 6.1.2Version List
    ×

    Version compatibilities of spring-context with this example:

    • 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
    • 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.1.0
    • 6.1.1
    • 6.1.2

    Versions in green have been tested.

  • JDK 17
  • Maven 3.8.1

Spring Conversion Service Example Select All Download
  • spring-conversion-service-basic
    • src
      • main
        • java
          • com
            • logicbig
              • example
                • ConversionServiceExample.java

    See Also