Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to specify database name in spring data mongoDB

Tags:

I am using Mongo repositories to perform CRUD operations as in the code below. Although this code works, but the documents and collections are created in a different DB than the one that I want. How can I explicitly specify a DB name to which documents will be stored.

The POJO class:

@Document(collection = "actors") public class Actor  {   @Id   private String id;   ...   //constructor   //setters & getters } 

The repository:

public interface ActorRepository extends MongoRepository<Actor, String>  {   public Actor findByFNameAndLName(String fName, String lName);   public Actor findByFName (String fName);   public Actor findByLName(String lName); } 

The service that uses the repository:

@Service public class ActorService  {   @Autowired   private ActorRepository actorRepository;    public Actor insert(Actor a)   {     a.setId(null);     return actorRepository.save(a);   } }  

And I access the service from a REST controller class:

@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();    }   ... } 

I have created this spring mongoDB configuration class which has the option of setting DB name, but could not figure out how to use it with the repositories above.

@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());     }     } 
like image 925
Sami Avatar asked Sep 09 '14 17:09

Sami


2 Answers

Add to the application.properties a line

spring.data.mongodb.database=your_db_name 

That worked for me, maybe too late for you but this could help someone looking for the same problem. see more properties here!

like image 71
drWatson Avatar answered Sep 26 '22 17:09

drWatson


For Spring-Boot:

You can either rely on autoconfiguration and then type in your application.properties file:

spring.data.mongodb.database=your_db_name 

or if you don't want to rely on Spring-boot autoconfiguration you can simply:

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

If you want to follow that path - I suggest having a look into into Spring Boot's Conditions Evaluation Report (https://www.baeldung.com/spring-boot-auto-configuration-report) and tweaking what you need to tweak. Hope this helps.

like image 36
Witold Kaczurba Avatar answered Sep 23 '22 17:09

Witold Kaczurba