Java – spring data Mongo seems to ignore hosts in XML configurations
I'm trying to start and run a simple "Hello world" program using spring data and mongodb Spring seems to ignore the mongodb host IP address configured in < Mongo: Mongo / > Element and try to connect to 127.0 0.1.
According to various tutorials, this is my spring configuration XML:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mongo="http://www.springframework.org/schema/data/mongo" xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <mongo:mongo host="10.125.0.68" port="27017" /> <mongo:db-factory dbname="test" /> <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" /> </bean> </beans>
This procedure:
import org.springframework.context.ApplicationContext; import org.springframework.context.support.GenericXmlApplicationContext; import org.springframework.data.mongodb.core.MongoOperations; public class Test1 { public static void main(String[] args) { ApplicationContext ctx = new GenericXmlApplicationContext("SpringConfig.xml"); MongoOperations mo = (MongoOperations)ctx.getBean("mongoTemplate"); DbDocument a = new DbDocument("John Smith","jsmith@plymouth.org"); if (!mo.collectionExists(DbDocument.class)) //<<<----- Exception here mo.createCollection(DbDocument.class); mo.save(a); } }
Exception thrown:
WARNING: Exception executing isMaster command on /127.0.0.1:27017 java.io.IOException: Couldn't connect to [/127.0.0.1:27017] bc:java.net.ConnectException: Connection refused: connect at com.mongodb.DBPort._open(DBPort.java:214) at com.mongodb.DBPort.go(DBPort.java:107) at com.mongodb.DBPort.go(DBPort.java:88) at com.mongodb.DBPort.findOne(DBPort.java:143) at com.mongodb.DBPort.runCommand(DBPort.java:148) at com.mongodb.DBTCPConnector.initDirectConnection(DBTCPConnector.java:548) at com.mongodb.DBTCPConnector.checkMaster(DBTCPConnector.java:527) at com.mongodb.DBTCPConnector.innerCall(DBTCPConnector.java:277) at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:257) at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:310) at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:295) at com.mongodb.DB.getCollectionNames(DB.java:412) at com.mongodb.DB.collectionExists(DB.java:454) at org.springframework.data.mongodb.core.MongoTemplate$5.doInDB(MongoTemplate.java:438) at org.springframework.data.mongodb.core.MongoTemplate$5.doInDB(MongoTemplate.java:436) at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:372) at org.springframework.data.mongodb.core.MongoTemplate.collectionExists(MongoTemplate.java:436) at org.springframework.data.mongodb.core.MongoTemplate.collectionExists(MongoTemplate.java:432) at org.nwea.jhg.mongo.Test1.main(Test1.java:18)
I can use GUI tools to connect to the specified address 10.125 0.68, and confirm that there is a database named test
I found several hits in stackoverflow, but none of them is similar enough to my case to solve the problem
Solution
Your mongodb factory does not recognize which mongodb database ip should be used
Try using a DB factory that references the mongotemplate value < constructor Arg name = "mongodbfactory" ref = "mongodbfactory" / >:
<mongo:mongo id="mongo" host="10.125.0.68" port="27017" /> <mongo:db-factory id="mongoDbFactory" host="10.125.0.68" port="27017" username="admin" password="xxx" dbname="test" mongo-ref="mongo" />
This should also be effective:
<mongo:mongo id="mongo" host="10.125.0.68" port="27017" /> <mongo:db-factory dbname="test" mongo-ref="mongo" />