feat[storage]: custom convert

This commit is contained in:
godotg
2024-07-20 08:47:01 +08:00
parent cc76daf6f1
commit 37cfbd6e6c
9 changed files with 54 additions and 16 deletions
@@ -26,6 +26,10 @@ import java.util.Set;
*/
public class ArrayConverter implements ConditionalGenericConverter {
public static final ArrayConverter INSTANCE = new ArrayConverter();
private ArrayConverter() {
}
@Override
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
@@ -14,6 +14,7 @@ package com.zfoo.storage.convert;
import com.zfoo.protocol.util.StringUtils;
import org.springframework.context.support.ConversionServiceFactoryBean;
import org.springframework.core.convert.ConversionService;
import org.springframework.core.convert.TypeDescriptor;
import java.lang.reflect.Array;
@@ -27,29 +28,36 @@ public abstract class ConvertUtils {
private static final TypeDescriptor TYPE_DESCRIPTOR = TypeDescriptor.valueOf(String.class);
private static final ConversionServiceFactoryBean conversionServiceFactoryBean = new ConversionServiceFactoryBean();
private static ConversionService conversionService = customConvert(Collections.emptySet());
static {
public static ConversionService customConvert(Set<?> customConverts) {
var converters = new HashSet<>();
converters.add(new ArrayConverter());
converters.add(new ListConverter());
converters.add(new SetConverter());
converters.add(new JsonToMapConverter());
converters.add(new JsonToObjectConverter());
converters.add(new StringToClassConverter());
converters.add(new StringToDateConverter());
// default convert
converters.add(ArrayConverter.INSTANCE);
converters.add(ListConverter.INSTANCE);
converters.add(SetConverter.INSTANCE);
converters.add(JsonToMapConverter.INSTANCE);
converters.add(JsonToObjectConverter.INSTANCE);
converters.add(StringToClassConverter.INSTANCE);
converters.add(StringToDateConverter.INSTANCE);
// custom convert
converters.addAll(customConverts);
ConversionServiceFactoryBean conversionServiceFactoryBean = new ConversionServiceFactoryBean();
conversionServiceFactoryBean.setConverters(converters);
conversionServiceFactoryBean.afterPropertiesSet();
return conversionServiceFactoryBean.getObject();
}
public static <T> T convert(String content, Class<T> targetType) {
return conversionServiceFactoryBean.getObject().convert(content, targetType);
return conversionService.convert(content, targetType);
}
public static Object convertField(String content, Field field) {
var targetType = new TypeDescriptor(field);
return conversionServiceFactoryBean.getObject().convert(content, TYPE_DESCRIPTOR, targetType);
return conversionService.convert(content, TYPE_DESCRIPTOR, targetType);
}
public static Object convertToArray(String content, Class<?> componentType) {
@@ -75,7 +83,7 @@ public abstract class ConvertUtils {
var splits = content.split(StringUtils.COMMA_REGEX);
var list = new ArrayList<T>();
for (var split : splits) {
var value = ConvertUtils.convert(StringUtils.trim(split), genericType);
var value = convert(StringUtils.trim(split), genericType);
list.add(value);
}
return Collections.unmodifiableList(list);
@@ -26,6 +26,12 @@ import java.util.Set;
* @author godotg
*/
public class JsonToMapConverter implements ConditionalGenericConverter {
public static final JsonToMapConverter INSTANCE = new JsonToMapConverter();
private JsonToMapConverter() {
}
@Override
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
return sourceType.getType() == String.class && targetType.isMap();
@@ -29,6 +29,10 @@ import java.util.Set;
*/
public class JsonToObjectConverter implements ConditionalGenericConverter {
public static final JsonToObjectConverter INSTANCE = new JsonToObjectConverter();
private JsonToObjectConverter() {
}
@Override
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
@@ -30,6 +30,10 @@ import java.util.Set;
*/
public class ListConverter implements ConditionalGenericConverter {
public static final ListConverter INSTANCE = new ListConverter();
private ListConverter() {
}
@Override
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
@@ -29,6 +29,10 @@ import java.util.Set;
*/
public class SetConverter implements ConditionalGenericConverter {
public static final SetConverter INSTANCE = new SetConverter();
private SetConverter() {
}
@Override
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
@@ -22,6 +22,10 @@ import org.springframework.core.convert.converter.Converter;
*/
public class StringToClassConverter implements Converter<String, Class<?>> {
public static final StringToClassConverter INSTANCE = new StringToClassConverter();
private StringToClassConverter() {
}
@Override
public Class<?> convert(String source) {
@@ -25,6 +25,10 @@ import java.util.Date;
*/
public class StringToDateConverter implements Converter<String, Date> {
public static final StringToDateConverter INSTANCE = new StringToDateConverter();
private StringToDateConverter() {
}
@Override
public Date convert(String source) {
@@ -31,10 +31,10 @@ public class ConversionTest {
private static final ConversionServiceFactoryBean csfb = new ConversionServiceFactoryBean();
private static final Set<Object> converters = new HashSet<>();
private static final StringToDateConverter std = new StringToDateConverter();
private static final StringToClassConverter stcc = new StringToClassConverter();
private static final JsonToMapConverter jtmc = new JsonToMapConverter();
private static final ArrayConverter jtac = new ArrayConverter();
private static final StringToDateConverter std = StringToDateConverter.INSTANCE;
private static final StringToClassConverter stcc = StringToClassConverter.INSTANCE;
private static final JsonToMapConverter jtmc = JsonToMapConverter.INSTANCE;
private static final ArrayConverter jtac = ArrayConverter.INSTANCE;
static {
converters.add(std);