Как указать имя базы данных в spring данных mongoDB

Я использую 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());
    }    
}

Ответ 1

Добавьте в application.properties строку:    spring.data.mongodb.database = yourdb

Это сработало для меня, может быть, слишком поздно для вас, но это может помочь кому-то искать ту же проблему. подробнее здесь!

Ответ 2

FWIW, я могу изменить имя базы данных манго, используя комбинацию кода Sezin Karli и 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:[email protected]" />

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

Имя базы данных было указано в двух местах. К сожалению, это кажется необходимым для успеха.

Ответ 3

Ваша конфигурация кажется прекрасной Сэмом. Вы уверены, что есть db под названием "MyDB"? Или вы уверены, что вы также не устанавливаете имя db в другом месте (например, контекст xml приложения), как показано ниже.

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