当前位置: 首页 > 知识库问答 >
问题:

小写枚举值从API到Mongo with Spring

司徒寒
2023-03-14

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

共有1个答案

司空温书
2023-03-14

关于接受枚举的小写值,您可以参考这个答案

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

典型的写转换器可以是:

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

您还需要编写相应的读取转换器,才能从数据库中成功地将小写字符串作为enum读取。典型的读取转换器如下所示:

@ReadingConverter
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,两个类注释属于包org.springframework.data.convert

然后在您的配置文件中,只需注册相同的:

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

其中CustomConversion属于org.springframework.data.mongodb.core.convert代码

这应该可以解决你的问题。这里需要注意的一件重要事情是,如果您希望应用程序中的所有枚举或应用程序中存在的一组特定枚举以小写形式持久化,我建议编写转换器工厂,而不是为每个这样的枚举单独编写一对转换器。这个答案已经很长了,所以没有写关于设置ConverterFactory的内容

一些有帮助的链接:

Mongo自定义转换器

Spring类型转换

另一个有用的SO问题

 类似资料:
  • 我应该工作,对吧?但它不是!!!!它告诉我dbValue可以转换为RelationActiveEnum...

  • 枚举具有名为'hash value'的属性,该属性是枚举内的索引。

  • 假设我有这样的枚举 我也有一个类,我想扩展有序[SimpleEnum] 所以在SimpleClass中,我只需要获取附加到相应SimpleEnum val的值。 在java中,我能够声明一个变量的枚举和访问一个实际的值对应于它的这个var,在scala我正在寻找一种方法来获取枚举的实例,并接触到它的值。

  • 问题内容: 假设是,我将如何产生给定序数的枚举值? 问题答案: 足够了。一条线; 足够简单。

  • 枚举 场域 Application.Properties(小写)

  • 问题内容: 如何反序列化包含不区分大小写的枚举值的JSON字符串?(使用Jackson Databind) JSON字符串: 和我的Java POJO: 在这种情况下,使用JSON反序列化将在可行的地方失败。但出于命名约定的原因,我也想工作。 序列化POJO也会导致大写 我想到了使用@JsonGetter: 而且有效。但是我想知道是否有更好的解决方案,因为这对我来说似乎是hack。 我也可以编写一