SpringBoot MongoDB 插入内容去掉_class字段

看了一些网上去掉_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的方法实现。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值