XML Configuration
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<util:properties id="mongoProperties" location="file:///storage/local.properties" />
<bean id="mongoService" class="com.business.persist.MongoService"></bean>
</beans>
and MongoService looks like
@Service
public class MongoService {
@Value("#{mongoProperties[host]}")
private String host;
@Value("#{mongoProperties[port]}")
private int port;
@Value("#{mongoProperties[database]}")
private String database;
private Mongo mongo;
private static final Logger LOGGER = LoggerFactory.getLogger(MongoService.class);
public MongoService() throws UnknownHostException {
LOGGER.info("host=" + host + ", port=" + port + ", database=" + database);
mongo = new Mongo(host, port);
}
public void putDocument(@Nonnull final DBObject document) {
LOGGER.info("inserting document - " + document.toString());
mongo.getDB(database).getCollection(getCollectionName(document)).insert(document, WriteConcern.SAFE);
}
I write my MongoServiceTest as
public class MongoServiceTest {
@Autowired
private MongoService mongoService;
public MongoServiceTest() throws UnknownHostException {
mongoRule = new MongoRule();
}
@Test
public void testMongoService() {
final DBObject document = DBContract.getUniqueQuery("001");
document.put(DBContract.RVARIABLES, "values");
document.put(DBContract.PVARIABLES, "values");
mongoService.putDocument(document);
}
and I see failures in tests as
12:37:25.224 [main] INFO c.s.business.persist.MongoService - host=null, port=0, database=null
java.lang.NullPointerException
at com.business.persist.MongoServiceTest.testMongoService(MongoServiceTest.java:40)
Which means bean was not able to read the values from local.properties
local.properties
### === MongoDB interaction === ###
host="127.0.0.1"
port=27017
database=contract
How do I fix this?
update It doesn't seem to read off the values even after creating setters/getters for the fields. I am really clueless now.
Update 01
After adding init() method and adding it to bean, it stil doesn't work. I don't even see Logging message
XML
<bean id="mongoService" class="com.business.persist.MongoService" init-method="init"></bean>
MongoService
@Service
public class MongoService {
@Value("#{mongoProperties['host']}")
private String host;
@Value("#{mongoProperties['port']}")
private int port;
@Value("#{mongoProperties['database']}")
private String database;
private Mongo mongo;
private static final Logger LOGGER = LoggerFactory.getLogger(MongoService.class);
public MongoService() {}
public void init() throws UnknownHostException {
LOGGER.info("host=" + host + ", port=" + port + ", database=" + database);
mongo = new Mongo(host, port);
}
public void putDocument(@Nonnull final DBObject document) {
LOGGER.info("inserting document - " + document.toString());
mongo.getDB(database).getCollection(getCollectionName(document)).insert(document, WriteConcern.SAFE);
}
How can I even debug this issue?
Thanks much!
There is one issue that I see here, you are instantiating a Mongo class inside MongoService
constructor, however at this point your properties have NOT been injected in based on the local.properties
file so the value of host, port and database will be null there.
Instead, what you can do is to not instantiate Mongo class within Service constructor, let the properties get injected into MongoService the way you are doing it, then create it as part of a init-method which is called after your properties are set:
in MongoService:
public void init(){
mongo = new Mongo(host, port);
}
and in your bean configuration:
<bean id="mongoService" class="com.business.persist.MongoService" init-method="init"></bean>