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" />
