在使用spring boot data mongo查询mongodb的时候,因为需要维持原有db中的数据,且原有数据中存在大量的int类型枚举值,在将查询结果转化为对象时无法转换成功,查询后得出以下通过Converter达到目的的方法。

枚举类如下:

@AllArgsConstructor
public enum Week {
    MONDAY(1, "周一"),
    TUESDAY(2, "周二"),
    WEDNESDAY(3, "周二"),
    THURSDAY(4, "周四"),
    FRIDAY(5, "周五");
    private final int value;
    private final String desc;
    public int value() {
        return value;
    public String desc() {
        return desc;
    public static Week valueOf(int value) {
        for (Week week : Week.values()) {
            if (week.value == value) {
                return week;
        return null;
    @Override
    public String toString() {
        return Integer.toString(value);

若数据库中存储的值为1,需要转化为枚举MONDAY,直接通过指定Mongo查询结果的对象会自动调用枚举自带的valueOf(String name),无法自动直接转化成功,需要做如下两个步骤:

  1. 创建转化的Converter
import org.springframework.core.convert.converter.Converter;
public class Integer2WeekConverter implements Converter<Integer, Week> {
    @Override
    public Week convert(Integer integer) {
        return Week.valueOf(integer);

其中的泛型Integer, Week指的是从Interger类型转为Week类型,convert方法就是会在转化过程自动调用的方法。
2. 创建配置类,自定义MongoCustomConversions

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.convert.*;
import java.util.Arrays;
@Configuration
public class MongoDBConfig {
    @Autowired
    MongoDbFactory mongoDbFactory;
    @Bean
    public MongoCustomConversions mongoCustomConversions() {
        return new MongoCustomConversions(
                Arrays.asList(new Integer2WeekConverter()));

该步骤是自定义MongoCustomConversions,注册我们自定义的Converter

完成以上步骤,Mongo在将查询结果转换成指定对象的时候,若发现有字段需要从Interger类型转换为Week枚举时,会自动调用Converter方法,需要注意的是要确保Mongo内的数据类型和我们左边指定的类型一致,比如int32对应Integer,int64对应Long,如果对应出错,则不会触发调用。

Python的数据类型有(dict、list、string、int、float、long、bool、None) Java的数据类型有(bool、char、byte、short、int、long、float、double) C的数据类型有(bit、bool、char、int、short、long、unsigned、double、float) Tcl的数据类型(int、bool、float、string) Ruby的数据类型(Number、String、Ranges、Symbols、true、false、Array、Hash) 他们的共同特点是, 项目用到了MongoDB,准备用来存储业务数据,前提是要实现事务,保证数据一致性,MongoDB从4.0开始支持事务,提供了面向复制集的多文档事务特性。能满足在多个操作,文档,集合,数据库之间的事务性,事务的特性。多文档事务在4.0版本仅支持复制集,对分片集群的事务性支持计划在4.2版本实现。由于我也算是一个java小白,没怎么弄清java事务机制,于是先建了个测试项目进行测试。在本... 这些异常通常是由于代码枚举常量名称拼写错误或不存在导致的。要解决这些异常,您需要检查代码涉及的枚举类和枚举常量名称是否正确。确保枚举常量名称与代码定义的名称完全匹配。如果枚举常量名称正确,则需要检查代码是否正确地引用了枚举常量。     Spring提供了对非关系数据库的集成,Springspring-data包提供了对mongoDB和redis集成的工具包。此篇博客介绍一下SpringMongoDB的集成。 导入工具包     需要的工具包有spring的jar包、spring-common的jar包以及spring-datamongoDB的jar包。其spring的jar包有aop、asm、asp 本文介绍在项目间类型、枚举类型的序列化和反序列化自定义的处理类,也可以使用注解。建议枚举都实现一个统一的接口,方便处理。我这定义了一个Dict接口。由于上边规定所有的枚举都需要实现Dict接口,下面的反序列化只针对符合条件的处理/*** 枚举反序列化器*/ 条件操作符(<,<=,=,!=,>=,>) db.getCollection('user').find({ "age" : { $gt: 22 } } ); // 大于: age > 22 db.getCollection('user').find({ "age" : { $lt: 22 } } ); // 小于: age < 22 db.getCollection('user').find({ "age" : { $ne: 22 } } ); // 等于: age = 22 db.getColle 1、使用@JsonCreator 反序列化 定义一个通过某个字段生成枚举的函数,并添加@JsonCreator注解。这样在前端传入int类型会转为枚举类型。 @JsonCreator public static SexEnum getByCode(int code) { for (SexEnum value : SexEnum.values()) { 在日常的项目,往往有很多枚举状态出现,比如性别、账户类型、订单状态等等,在代码编写阶段,对于这种状态类型,使用枚举类是非常方便的,但是由于为了方便与前端或数据库的网络传输、映射和存储,往往会采用约定数字或者特定字符来标识状态,我们有需要将枚举读写为数字或字符,如果用枚举,就要到处添加转换,如果不用枚举,就要头疼会不会写错状态。 怎么解决这个困扰呢?我们先来看最终效果: 只需一个注解,即可配置好让枚举在mybatis存储到数据库采用数字id,json序列化传给前端采用字符串,在controlle 1、Spring Boot 枚举类型的自动转换 需求:一般我们在数据库都会定义数型的枚举常量,不管是序列化还是反序列化都是需要我们手动去转换成枚举类型的,既然这样我们能不能让它们自动转换呢?接下来我们就来尝试一下: 首先解决如何接收枚举类型。 枚举父类 * @author rookie public interface IEnum<T extends Serializable> { * 获取 * @return