2014-09-09 5 views
10

Sto usando repository Mongo per eseguire operazioni CRUD come nel codice qui sotto. Sebbene questo codice funzioni, ma i documenti e le raccolte vengono creati in un DB diverso da quello che voglio. Come posso specificare esplicitamente un nome DB su cui verranno archiviati i documenti.come specificare il nome del database nei dati di primavera mongoDB

La classe POJO:

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

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

Il servizio che utilizza il repository:

@Service 
public class ActorService 
{ 
    @Autowired 
    private ActorRepository actorRepository; 

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

E ho accedere al servizio da una classe controller 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(); 

    } 

... 
} 

Ho creato questa classe di configurazione mongoDB di primavera che ha l'opzione di impostare il nome di DB, ma non è riuscito a capire come usarlo con i repository di cui sopra.

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

Hai trovato la risposta? Rimanere bloccato con lo stesso problema dopo aver seguito questo tutorial: https://spring.io/guides/gs/accessing-mongodb-data-rest/ – Mussa

+0

Purtroppo, no. – Sami

risposta

1

La tua configurazione sembra andare bene Sam. Sei sicuro che ci sia un db chiamato "MyDB"? Oppure sei sicuro di non aver impostato il nome db anche altrove (come ad esempio contesto xml dell'app) come di seguito.

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

sì c'è DB e io non uso altre configurazioni, tuttavia la tua domanda mi ha fatto capire che è GridFsStore quindi ha solo due collezioni (blocchi e file). Non sei sicuro se sia possibile utilizzarlo anche per altre collezioni? – Sami

+0

Anche la modifica del DB a un altro (non GridF) non ha funzionato. Anche se lascio cadere il DB, crea un nuovo DB chiamato test e memorizza i documenti lì. – Sami

+0

Se sei sicuro che non ci sia un riferimento db di prova nel tuo progetto, potresti provare un'altra configurazione di mongo primavera che troverai su google. Mi dispiace non potrei aiutare ulteriormente –

2

FWIW, sono in grado di cambiare il nome del database Mongo utilizzando la combinazione di Sezin Karli e il codice di Sam sopra, nonostante la soluzione non lavorare in situazione di Sam.

Il mio file POM contiene solo questo riferimento a MongoDB:

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

In particolare, un primo momento ho creato un file beans.xml di risorse con le seguenti informazioni:

<?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> 

Poi, ho cambiato il mio principale per caricare la configurazione tramite:

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

Nota: questo deve essere eseguito prima in main().

Infine, ho aggiunto al mio extends AbstractMongoConfiguration start-class e implementato

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

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

Il nome del database è stato specificato in due posizioni. Sfortunatamente, questo sembra necessario per il successo.

14

aggiungere alla application.properties una linea: spring.data.mongodb.database = yourdb

che ha funzionato per me, forse troppo tardi per voi, ma questo potrebbe aiutare qualcuno che cerca lo stesso problema. vedi altre proprietà here!

Problemi correlati