使用Spring从API到Mongo的小写枚举值

时间:2017-02-19 21:32:47

标签: rest spring-boot enums spring-data-mongodb

使用Spring Boot,我暴露了一个REST API,它接受我的域对象作为JSON主体,并尝试将其持久化到Mongo文档。如何在JSON请求中接受此枚举的小写值将它们以小写形式保存为Mongo?

1 个答案:

答案 0 :(得分:1)

关于接受枚举的小写值,您可以参考wikipedia definition

关于将它们以小写形式保存到MongoDB,您需要编写自定义转换器并注册它们。

典型的写入转换器可以是:

public final class YourEnumWriteConverter implements Converter<YourEnum, String> {
    @Override
    public String convert(YourEnum source) {
        return source == null ? "" : source.name().toLowerCase();
    }
}

您还需要编写相应的读取转换器,以便从DB成功读取小写字符串作为枚举。典型的读取转换器如下所示:

public final class YourEnumReadConverter implements Converter<String, YourEnum> {
    @Override
    public YourEnum convert(String source) {
        return source == null ? null : Arrays.stream(YourEnum.values()).
                                              filter(enumInstance -> enumInstance.name().equalsIgnoreCase(source.trim())).
                                              findFirst().
                                              orElse(null);
    }
}

其中Converter属于包org.springframework.core.convert.converter

然后在您的@Configuration文件中,只注册:

@Bean
public CustomConversions customConversions() {
    List<Converter<?, ?>> converterList = new ArrayList<>();
    converterList.add(new YourEnumWriteConverter());
    converterList.add(new YourEnumReadConverter());
    return new CustomConversions(converterList);
}

其中CustomConversions属于org.springframework.data.mongodb.core.convert

这应该可以解决您的问题。这里要注意的一件重要事情是,如果您希望应用程序中的所有枚举或应用程序中存在的特定枚举集以小写形式保留,我建议您编写ConverterFactory而不是单独编写一对每个这样的枚举的Converter个。这个答案已经很长了,所以不要写关于设置ConverterFactory

的内容

一些有用的链接:

this answer

Mongo Custom Converters

Spring Type Conversion