public class GenericConversionService extends java.lang.Object implements ConfigurableConversionService
ConversionService
implementation suitable for use in most environments.
Indirectly implements ConverterRegistry
as registration API through the
ConfigurableConversionService
interface.Modifier and Type | Class and Description |
---|---|
private class |
GenericConversionService.ConverterAdapter
Adapts a
Converter to a GenericConverter . |
private static class |
GenericConversionService.ConverterCacheKey
Key for use with the converter cache.
|
private class |
GenericConversionService.ConverterFactoryAdapter
Adapts a
ConverterFactory to a GenericConverter . |
private static class |
GenericConversionService.Converters
Manages all converters registered with the service.
|
private static class |
GenericConversionService.ConvertersForPair
Manages converters registered with a specific
GenericConverter.ConvertiblePair . |
private static class |
GenericConversionService.NoOpConverter
Internal converter that performs no operation.
|
Modifier and Type | Field and Description |
---|---|
private java.util.Map<GenericConversionService.ConverterCacheKey,GenericConverter> |
converterCache |
private GenericConversionService.Converters |
converters |
private static java.lang.Object |
javaUtilOptionalEmpty
Java 8's java.util.Optional.empty()
|
private static GenericConverter |
NO_MATCH
Used as a cache entry when no converter is available.
|
private static GenericConverter |
NO_OP_CONVERTER
General NO-OP converter used when conversion is not required.
|
Constructor and Description |
---|
GenericConversionService() |
Modifier and Type | Method and Description |
---|---|
<S,T> void |
addConverter(java.lang.Class<S> sourceType,
java.lang.Class<T> targetType,
Converter<? super S,? extends T> converter)
Add a plain converter to this registry.
|
void |
addConverter(Converter<?,?> converter)
Add a plain converter to this registry.
|
void |
addConverter(GenericConverter converter)
Add a generic converter to this registry.
|
void |
addConverterFactory(ConverterFactory<?,?> converterFactory)
Add a ranged converter factory to this registry.
|
private void |
assertNotPrimitiveTargetType(TypeDescriptor sourceType,
TypeDescriptor targetType) |
boolean |
canBypassConvert(TypeDescriptor sourceType,
TypeDescriptor targetType)
Return whether conversion between the sourceType and targetType can be bypassed.
|
boolean |
canConvert(java.lang.Class<?> sourceType,
java.lang.Class<?> targetType)
Return
true if objects of sourceType can be converted to the targetType . |
boolean |
canConvert(TypeDescriptor sourceType,
TypeDescriptor targetType)
Return
true if objects of sourceType can be converted to the targetType . |
<T> T |
convert(java.lang.Object source,
java.lang.Class<T> targetType)
Convert the given
source to the specified targetType . |
java.lang.Object |
convert(java.lang.Object source,
TypeDescriptor targetType)
Convenience operation for converting a source object to the specified targetType,
where the targetType is a descriptor that provides additional conversion context.
|
java.lang.Object |
convert(java.lang.Object source,
TypeDescriptor sourceType,
TypeDescriptor targetType)
Convert the given
source to the specified targetType . |
protected java.lang.Object |
convertNullSource(TypeDescriptor sourceType,
TypeDescriptor targetType)
Template method to convert a
null source. |
protected GenericConverter |
getConverter(TypeDescriptor sourceType,
TypeDescriptor targetType)
Hook method to lookup the converter for a given sourceType/targetType pair.
|
protected GenericConverter |
getDefaultConverter(TypeDescriptor sourceType,
TypeDescriptor targetType)
Return the default converter if no converter is found for the given sourceType/targetType pair.
|
private ResolvableType[] |
getRequiredTypeInfo(java.lang.Object converter,
java.lang.Class<?> genericIfc) |
private java.lang.Object |
handleConverterNotFound(java.lang.Object source,
TypeDescriptor sourceType,
TypeDescriptor targetType) |
private java.lang.Object |
handleResult(TypeDescriptor sourceType,
TypeDescriptor targetType,
java.lang.Object result) |
private void |
invalidateCache() |
void |
removeConvertible(java.lang.Class<?> sourceType,
java.lang.Class<?> targetType)
Remove any converters from sourceType to targetType.
|
java.lang.String |
toString() |
private static final GenericConverter NO_OP_CONVERTER
private static final GenericConverter NO_MATCH
private static java.lang.Object javaUtilOptionalEmpty
private final GenericConversionService.Converters converters
private final java.util.Map<GenericConversionService.ConverterCacheKey,GenericConverter> converterCache
public void addConverter(Converter<?,?> converter)
ConverterRegistry
addConverter
in interface ConverterRegistry
public <S,T> void addConverter(java.lang.Class<S> sourceType, java.lang.Class<T> targetType, Converter<? super S,? extends T> converter)
ConverterRegistry
Allows for a Converter to be reused for multiple distinct pairs without having to create a Converter class for each pair.
addConverter
in interface ConverterRegistry
public void addConverter(GenericConverter converter)
ConverterRegistry
addConverter
in interface ConverterRegistry
public void addConverterFactory(ConverterFactory<?,?> converterFactory)
ConverterRegistry
addConverterFactory
in interface ConverterRegistry
public void removeConvertible(java.lang.Class<?> sourceType, java.lang.Class<?> targetType)
ConverterRegistry
removeConvertible
in interface ConverterRegistry
sourceType
- the source typetargetType
- the target typepublic boolean canConvert(java.lang.Class<?> sourceType, java.lang.Class<?> targetType)
ConversionService
true
if objects of sourceType
can be converted to the targetType
.
If this method returns true
, it means ConversionService.convert(Object, Class)
is capable
of converting an instance of sourceType
to targetType
.
Special note on collections, arrays, and maps types:
For conversion between collection, array, and map types, this method will return true
even though a convert invocation may still generate a ConversionException
if the
underlying elements are not convertible. Callers are expected to handle this exceptional case
when working with collections and maps.
canConvert
in interface ConversionService
sourceType
- the source type to convert from (may be null
if source is null
)targetType
- the target type to convert to (required)true
if a conversion can be performed, false
if notpublic boolean canConvert(TypeDescriptor sourceType, TypeDescriptor targetType)
ConversionService
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.
If this method returns true
, it means ConversionService.convert(Object, TypeDescriptor, TypeDescriptor)
is capable of converting an instance of sourceType
to targetType
.
Special note on collections, arrays, and maps types:
For conversion between collection, array, and map types, this method will return true
even though a convert invocation may still generate a ConversionException
if the
underlying elements are not convertible. Callers are expected to handle this exceptional case
when working with collections and maps.
canConvert
in interface ConversionService
sourceType
- context about the source type to convert from
(may be null
if source is null
)targetType
- context about the target type to convert to (required)true
if a conversion can be performed between the source and target types,
false
if notpublic boolean canBypassConvert(TypeDescriptor sourceType, TypeDescriptor targetType)
More precisely, this method will return true if objects of sourceType can be converted to the targetType by returning the source object unchanged.
sourceType
- context about the source type to convert from
(may be null
if source is null
)targetType
- context about the target type to convert to (required)true
if conversion can be bypassed; false
otherwisejava.lang.IllegalArgumentException
- if targetType is null
public <T> T convert(java.lang.Object source, java.lang.Class<T> targetType)
ConversionService
source
to the specified targetType
.convert
in interface ConversionService
source
- the source object to convert (may be null
)targetType
- the target type to convert to (required)public java.lang.Object convert(java.lang.Object source, TypeDescriptor sourceType, TypeDescriptor targetType)
ConversionService
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.convert
in interface ConversionService
source
- the source object to convert (may be null
)sourceType
- context about the source type to convert from
(may be null
if source is null
)targetType
- context about the target type to convert to (required)targetType
public java.lang.Object convert(java.lang.Object source, TypeDescriptor targetType)
convert(Object, TypeDescriptor, TypeDescriptor)
and
encapsulates the construction of the sourceType descriptor using
TypeDescriptor.forObject(Object)
.source
- the source objecttargetType
- the target typeConversionException
- if a conversion exception occurredjava.lang.IllegalArgumentException
- if targetType is null
,
or sourceType is null
but source is not null
public java.lang.String toString()
toString
in class java.lang.Object
protected java.lang.Object convertNullSource(TypeDescriptor sourceType, TypeDescriptor targetType)
null
source.
The default implementation returns null
or the Java 8
Optional.empty()
instance if the target type is
java.util.Optional
. Subclasses may override this to return
custom null
objects for specific target types.
sourceType
- the sourceType to convert fromtargetType
- the targetType to convert toprotected GenericConverter getConverter(TypeDescriptor sourceType, TypeDescriptor targetType)
sourceType
- the source type to convert fromtargetType
- the target type to convert tonull
if no suitable converter was foundgetDefaultConverter(TypeDescriptor, TypeDescriptor)
protected GenericConverter getDefaultConverter(TypeDescriptor sourceType, TypeDescriptor targetType)
Returns a NO_OP Converter if the sourceType is assignable to the targetType.
Returns null
otherwise, indicating no suitable converter could be found.
sourceType
- the source type to convert fromtargetType
- the target type to convert toprivate ResolvableType[] getRequiredTypeInfo(java.lang.Object converter, java.lang.Class<?> genericIfc)
private void invalidateCache()
private java.lang.Object handleConverterNotFound(java.lang.Object source, TypeDescriptor sourceType, TypeDescriptor targetType)
private java.lang.Object handleResult(TypeDescriptor sourceType, TypeDescriptor targetType, java.lang.Object result)
private void assertNotPrimitiveTargetType(TypeDescriptor sourceType, TypeDescriptor targetType)