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