如何在spring data mongoDB中指定数据库名称

Posted

技术标签:

【中文标题】如何在spring data mongoDB中指定数据库名称【英文标题】:how to specify database name in spring data mongoDB 【发布时间】:2014-11-03 05:46:04 【问题描述】:

我正在使用 Mongo 存储库执行 CRUD 操作,如下面的代码所示。尽管此代码有效,但文档和集合是在与我想要的不同的数据库中创建的。如何明确指定存储文档的数据库名称。

POJO 类:

@Document(collection = "actors")
public class Actor 

  @Id
  private String id;
  ...
  //constructor
  //setters & getters

存储库:

public interface ActorRepository extends MongoRepository<Actor, String> 

  public Actor findByFNameAndLName(String fName, String lName);
  public Actor findByFName (String fName);
  public Actor findByLName(String lName);

使用存储库的服务:

@Service
public class ActorService 

  @Autowired
  private ActorRepository actorRepository;

  public Actor insert(Actor a)
  
    a.setId(null);
    return actorRepository.save(a);
  
 

我从 REST 控制器类访问服务:

@RestController
public class Controllers 


  private static final Logger logger = Logger.getLogger(Controllers.class);
  private static final ApplicationContext ctx = new  AnnotationConfigApplicationContext(SpringMongoConfig.class);

  @Autowire
  private ActorService actorService;

  @RequestMapping(value="/createActor", method=RequestMethod.POST)
  public @ResponseBody String createActor(@RequestParam(value = "fName") String fName,
        @RequestParam(value = "lName") String lName,
        @RequestParam(value = "role") String role)
  
    return actorService.insert(new Actor(null,fName,lName,role)).toString();

  

 ...

我已经创建了这个 spring mongoDB 配置类,它可以选择设置数据库名称,但无法弄清楚如何将它与上面的存储库一起使用。

@Configuration
public class SpringMongoConfig extends AbstractMongoConfiguration
 
    @Bean
    public GridFsTemplate gridFsTemplate() throws Exception 
    
        return new GridFsTemplate(mongoDbFactory(), mappingMongoConverter());
    

    @Override
    protected String getDatabaseName() 
    
        return "MyDB";
    

    @Override
    @Bean
    public Mongo mongo() throws Exception 
    
        return new MongoClient("localhost" , 27017 );
    

    public @Bean MongoTemplate mongoTemplate() throws Exception 
    
        return new MongoTemplate(mongo(), getDatabaseName());
        

【问题讨论】:

你找到答案了吗?遵循本教程后遇到了同样的问题:spring.io/guides/gs/accessing-mongodb-data-rest 【参考方案1】:

对于Spring-Boot

您可以依赖自动配置,然后输入您的 application.properties 文件:

spring.data.mongodb.database=your_db_name

或者,如果您不想依赖 Spring-boot 自动配置,您可以简单地:

import com.mongodb.MongoClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;

/**
 * MonfoConfig
 */
@Configuration
public class MongoConfig 

    @Bean
    public MongoDbFactory mongoDbFactory() 

        MongoClient mongoClient = new MongoClient("127.0.0.1:27017");

        return new SimpleMongoDbFactory(mongoClient, "databasenamehere" );
    

    @Bean
    public MongoTemplate mongoTemplate() 
        return new MongoTemplate(mongoDbFactory());
    

如果您想走这条路 - 我建议您查看 Spring Boot 的条件评估报告 (https://www.baeldung.com/spring-boot-auto-configuration-report) 并调整您需要调整的内容。希望这会有所帮助。

【讨论】:

【参考方案2】:

在application.properties中添加一行

spring.data.mongodb.database=your_db_name

这对我有用,对你来说可能为时已晚,但这可以帮助寻找同样问题的人。 查看更多属性here!

【讨论】:

链接已失效。【参考方案3】:

FWIW,尽管解决方案在 Sam 的情况下不起作用,但我可以使用上述 Sezin Karli 和 Sam 代码的组合来更改 mongo 数据库名称。

我的 POM 文件只包含对 mongodb 的引用:

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-mongodb</artifactId>
    </dependency>

具体来说,我首先在资源中创建了一个 beans.xml 文件,其中包含以下信息:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mongo="http://www.springframework.org/schema/data/mongo"
       xsi:schemaLocation="http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <mongo:mongo-client credentials="user:password@database" />

    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg name="mongo" ref="mongo"/>
        <constructor-arg name="databaseName" value="myDBName"/>
    </bean>
</beans>

接下来,我将 main 更改为通过以下方式加载配置:

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

注意:这必须首先在 main() 中执行。

最后,我将extends AbstractMongoConfiguration 添加到我的开始类并实现了

    @Override
    public String getDatabaseName() 
        return "myDBName";
    

    @Override
    @Bean
    public Mongo mongo() throws Exception 
        return new MongoClient("localhost" , 27017 );
    

在两个位置指定了数据库名称。不幸的是,这似乎是成功所必需的。

【讨论】:

AbstractMongoConfiguration 似乎对我不起作用(春季启动)......除了抽象类在 2017 年发生了变化。可能值得更新答案以获得支持 ;-)。干杯。【参考方案4】:

山姆,您的配置似乎很好。你确定有一个名为“MyDB”的数据库吗? 或者您确定您没有在其他地方(例如应用上下文 xml)设置数据库名称,如下所示。

 <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
     <constructor-arg name="mongo" ref="mongo"/>
     <constructor-arg name="databaseName" value="demo"/>
   </bean>

【讨论】:

是的,有 DB,我不使用任何其他配置,但是您的问题让我意识到它是 GridFsStore,因此它只有两个集合(块和文件)。不确定它是否也可以用于其他收藏? 将数据库更改为另一个(不是 GridFs)也不起作用。即使我删除了数据库,它也会创建一个名为 test 的新数据库并将文档存储在那里。 如果你确定你的项目中没有测试数据库引用,也许你可以尝试另一个你可以通过谷歌搜索找到的 spring mongo 配置。对不起,我无法提供进一步的帮助

以上是关于如何在spring data mongoDB中指定数据库名称的主要内容,如果未能解决你的问题,请参考以下文章

在spring mongodb查询中指定多个标准

Spring Boot 应用程序未连接到 Mongodb 的 application.property 中指定的数据库

如何使用多个条件查找查询在 MongoDB 中指定字段?

如何使用 spring 的 jdbcTemplate 在 SQL 查询中指定参数

如何在 Spring/Spring Boot pom.xml 中指定 Java 版本?

如何在 Spring Messaging 中指定处理程序生成的内容类型?