SpringBoot MongoDB 插入内容去掉_class字段

本文介绍如何在SpringBoot项目中使用MongoDB时,通过自定义MongoTemplate和MappingMongoConverter来移除插入文档时自动生成的_class字段,避免其对数据结构的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看了一些网上去掉_class的文章 基本都是一样的 加个MongoConfig 配置文件,而且没有参考源码。直接添加一个MongoConfig 配置文件并没有什么效果,可能是还有别的地方需要做修改吧,可以去试试在启动类关闭mongodb自动配置 试试(我没有去验证)

下面介绍 我自己实现的 springboot mongodb 插入内容时 去掉_class 字段的方法: 创建 MongoTemplate 时设置 自定义的去除_class的 MappingMongoConverter

最后附上可行源码demo下载连接

下面介绍的源码是在之前文章 : springboot mongodb 账号密码认证连接 源码demo 的基础上修改了一下配置文件 实现去除添加内容的 _class 字段

修改后的配置文件 TestdbMongoConfiguration

package com.example.mongodb_password_demo.config;

import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.convert.CustomConversions;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
import org.springframework.data.mongodb.core.convert.DbRefResolver;
import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;

import java.util.ArrayList;
import java.util.List;

@Configuration
@ConfigurationProperties(prefix = "spring.data.mongodb.testdb")
public class TestdbMongoConfiguration {
    // MongoDB Properties

    private ArrayList<String> addresses;
    private String credentialdatabase, credentialusername, credentialpassword, database;

    public ArrayList<String> getAddresses() {
        return addresses;
    }
    public void setAddresses(ArrayList<String> addresses) {
        this.addresses = addresses;
    }
    public String getCredentialdatabase() {
        return credentialdatabase;
    }
    public void setCredentialdatabase(String credentialdatabase) {
        this.credentialdatabase = credentialdatabase;
    }
    public String getCredentialusername() {
        return credentialusername;
    }
    public void setCredentialusername(String credentialusername) {
        this.credentialusername = credentialusername;
    }
    public String getCredentialpassword() {
        return credentialpassword;
    }
    public void setCredentialpassword(String credentialpassword) {
        this.credentialpassword = credentialpassword;
    }
    public String getDatabase() {
        return database;
    }
    public void setDatabase(String database) {
        this.database = database;
    }

    /**
     * 覆盖容器中默认的MongoDbFacotry Bean
     */
    public MongoDbFactory mongoDbFactory() {
        // MongoDB地址列表
        List<ServerAddress> serverAddresses = new ArrayList<ServerAddress>();
        for (String address : addresses) {
            String[] hostAndPort = address.split(":");
            String host = hostAndPort[0];
            Integer port = Integer.parseInt(hostAndPort[1]);
            ServerAddress serverAddress = new ServerAddress(host, port);
            serverAddresses.add(serverAddress);
        }

        List<MongoCredential> mongoCredentialList = new ArrayList<>();
        //添加了一个密码认证用户到认证数组中: 认证数据库admin里的root用户(这里只是为了简单,认证root用户 权限够)
        mongoCredentialList.add(MongoCredential.createCredential(credentialusername, credentialdatabase, credentialpassword.toCharArray()));
        //创建认证客户端
        MongoClient mongoClient = new MongoClient(serverAddresses, mongoCredentialList);
        //创建连接要操作数据库的工厂
        return new SimpleMongoDbFactory(mongoClient, database);
    }

    //第一个数据库 默认作为主数据库 需要添加注解 @Primary ,后面的数据库不需要这个注解
    @Primary
    @Bean(name = "testdbMongoTemplate")
    public  MongoTemplate getMongoTemplate(MongoMappingContext context, BeanFactory beanFactory) throws Exception {
        MongoDbFactory factory = mongoDbFactory();
        DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);
        MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context);
        try {
            mappingConverter.setCustomConversions(beanFactory.getBean(CustomConversions.class));
        } catch (NoSuchBeanDefinitionException ignore) {
        }
        //去掉_class字段
        mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null));
        return new MongoTemplate(mongoDbFactory(),mappingConverter);
    }
}

修改测试类增加插入内容的访问接口
TestController

package com.example.mongodb_password_demo.controller;

import com.example.mongodb_password_demo.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @Autowired
    @Qualifier(value = "testdbMongoTemplate")
    protected MongoTemplate testdbMongoTemplate;

    @RequestMapping("/test")
    public String test(){
        User user = testdbMongoTemplate.insert(new User("root","123456","zhangsan","188xxx"));
        if(user == null){
            return "inser user failed";
        }
        return user.toString();
    }
}

测试

浏览器输入 127.0.0.1:8093/test
在这里插入图片描述
数据库user集合插入了一条内容
在这里插入图片描述

源码 (ip port 账号密码等被我屏蔽修改了,需根据自己情况修改 ,我测试代码里面访问的数据库是testdb 先创建这个数据库)

链接:https://pan.baidu.com/s/1bx06dufiQF-7f_snlkgXKQ
提取码:5fbf

最后

这里只是介绍了一个数据库源 没连接池 的demo,关于 多数据库源切换 连接池配置 可以看下我之前springboot mongodb 文章 结合本文介绍的去除_class的方法实现。

### 如何在 Spring Boot 中集成 MongoDB忽略 `_class` 字段 在使用 Spring Data MongoDB 进行开发时,默认情况下,Spring 会在文档中存储一个名为 `_class` 的字段。这个字段用于记录实体类的全限定名(FQCN),以便支持多态查询和其他功能[^1]。然而,在某些场景下,开发者可能希望禁用这一行为。 可以通过以下方法来实现忽略 `_class` 字段: #### 方法一:全局配置 通过自定义 `MongoCustomConversions` 或者设置 `MappingContext` 来控制映射行为。具体来说,可以创建一个 Bean 定义并覆盖默认的行为: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.mongodb.MongoDatabaseFactory; import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver; import org.springframework.data.mongodb.core.convert.MappingMongoConverter; import org.springframework.data.mongodb.core.mapping.MongoMappingContext; @Configuration public class MongoConfig { @Bean public MappingMongoConverter mappingMongoConverter(MongoDatabaseFactory mongoDatabaseFactory, MongoMappingContext mongoMappingContext) { MappingMongoConverter converter = new MappingMongoConverter( new DefaultDbRefResolver(mongoDatabaseFactory), mongoMappingContext); // 关键一步:关闭 _class 字段的保存 converter.setTypeMapper(new DefaultMongoTypeMapper(null)); return converter; } } ``` 上述代码的关键在于调用了 `setTypeMapper` 方法,并传入了一个新的 `DefaultMongoTypeMapper` 实例,其中参数为 `null`。这会告诉 Spring 不要在数据库中写入 `_class` 字段[^2]。 --- #### 方法二:局部配置 如果不想影响整个项目,而是针对特定的实体类忽略 `_class` 字段,则可以在该类上添加注解 `@Document` 和其他相关属性: ```java import org.springframework.data.annotation.TypeAlias; import org.springframework.data.mongodb.core.mapping.Document; @Document(collection = "users") @TypeAlias("User") // 使用别名替代完整的 FQCN public class User { private String id; private String name; private int age; // Getters and Setters... } ``` 这里的 `@TypeAlias` 注解允许指定一个短名称作为类型标记,从而减少冗余信息的同时避免显式的 `_class` 存储[^3]。 --- #### 验证效果 完成以上任一种方式后,重新运行应用程序并通过 Postman 或其他工具测试 CRUD 功能。此时再查看 MongoDB 数据库中的实际存储结构,应该已经看不到 `_class` 字段的存在[^4]。 --- ### 注意事项 尽管移除 `_class` 能够简化数据模型,但在涉及继承关系或者复杂对象图的情况下可能会带来兼容性问题。因此建议仅当确实不需要此类元数据时才执行这些操作。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值