Skip to content

Instantly share code, notes, and snippets.

@masa2146
Created January 6, 2022 10:05
Show Gist options
  • Save masa2146/16d5d9bbc83561d8734df1036c16f87f to your computer and use it in GitHub Desktop.
Save masa2146/16d5d9bbc83561d8734df1036c16f87f to your computer and use it in GitHub Desktop.
# Spring Mongo DB Enum Dynamic String Converter

Spring Mongo DB Enum Dynamic String Converter

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment