public interface AbstractEnum {
String toString();
@JsonValue
String getValue();
static <T extends Enum<T> & AbstractEnum> T fromString(String text, Class<T> aClass) {
if (text == null) {
return null;
}
if (aClass == null) {
return null;
}
for (T en : aClass.getEnumConstants()) {
if (en.getValue().equals(text)) {
return en;
}
}
return null;
}
}
@ReadingConverter
public class EnumConverterFactory implements ConverterFactory<String, Enum<?>> {
@Override
public <T extends Enum<?>> Converter<String, T> getConverter(Class<T> targetType) {
Class<?> enumType = targetType;
while (enumType != null && !enumType.isEnum()) {
enumType = enumType.getSuperclass();
}
if (enumType == null) {
throw new IllegalArgumentException(
"The target type " + targetType.getName() + " does not refer to an enum");
}
return new StringToEnum(enumType);
}
public static class StringToEnum<T extends Enum<T> & AbstractEnum> implements Converter<String, Comparable<? extends Comparable<?>>> {
private final Class<T> enumType;
public StringToEnum(Class<T> enumType) {
this.enumType = enumType;
}
@Override
public Comparable<? extends Comparable<?>> convert(@NotNull String source) {
if (enumType == null) {
return source;
}
T enumVal = AbstractEnum.fromString(source, enumType);
if (enumVal != null) {
return enumVal;
}
return source;
}
}
}
@WritingConverter
public class EnumToStringConverter implements Converter<Enum<?>, Object> {
@Override
public Object convert(@NotNull Enum<?> source) {
if (source instanceof AbstractEnum) {
return ((AbstractEnum) (source)).getValue();
} else {
return source.name();
}
}
}
@Bean
@Override
public MongoCustomConversions customConversions() {
List<Converter<?, ?>> converterList = new ArrayList<>();
converterList.add(new EnumToStringConverter());
// converterList.add(new EnumConverterFactory.StringToEnum<>(null));
return MongoCustomConversions.create(mongoConverterConfigurationAdapter1 ->mongoConverterConfigurationAdapter1
.registerConverters(converterList)
.registerConverterFactory(new EnumConverterFactory()));
}
And then all enum classes should be implemented with AbstractEnum
inteface.