如何在Spring Data MongoDB中指定数据库名称

26

我正在使用Mongo repositories执行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());
    }    
}

你找到答案了吗?在按照这个教程(https://spring.io/guides/gs/accessing-mongodb-data-rest/)操作后,是否遇到了相同的问题? - Mussa
4个回答

36

在application.properties中添加一行

spring.data.mongodb.database=your_db_name

这对我有用,也许对你来说太晚了,但这可能会帮助寻找相同问题的人。 在此处查看更多属性


10

对于Spring-Boot

您可以依赖于自动配置,然后在应用程序属性文件中输入以下内容:

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

FWIW,我能够使用Sezin Karli和Sam上面的代码组合来更改mongo数据库名称,尽管该解决方案在Sam的情况下无法工作。

我的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>

接下来,我将我的主函数更改为通过以下方式加载配置:

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 );
    }

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


抽象的Mongo配置(AbstractMongoConfiguration)貌似在我的Spring Boot项目中不起作用了…… 此外,这个抽象类在2017年已经更改。也许更新答案能够获得点赞;-)。干杯。 - Witold Kaczurba

1

你的配置似乎没问题,Sam。你确定有一个名为"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>

是的,有数据库,我没有使用任何其他配置。不过你的问题让我意识到它是GridFsStore,所以它只有两个集合(chunks和files)。不确定是否可以将其用于其他集合? - Sami
将数据库更改为另一个(不是GridFs)也没有起作用。即使我删除了数据库,它仍会创建一个名为test的新数据库并将文档存储在那里。 - Sami
如果您确定项目中没有测试数据库引用,也许您可以尝试另一个在谷歌上找到的Spring Mongo配置。很抱歉我无法提供更多帮助。 - Sezin Karli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接