2012-06-29 34 views
0

XML配置春:豆无法读出从外部属性文件值使用@Value注释时

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

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

我写我的MongoServiceTest作为

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

我看到测试中的失败为

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) 

这意味着豆无法从local.properties读出的值

local.properties

### === MongoDB interaction === ### 
host="127.0.0.1" 
port=27017 
database=contract 

我该如何解决这个问题?

更新 即使为字段创建setter/getters之后,它似乎也没有读取值。我现在真的很无能。

更新01

增加init()方法并将其添加到豆腐后,还是老样子不起作用。我甚至不看日志消息
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); 
    } 

我怎么能连调试这个问题?

非常感谢!

回答

1

我在这里看到一个问题,你在MongoService构造函数中实例化一个Mongo类,但是此时你的属性没有被注入到基于local.properties文件中,所以主机,端口和数据库的值将会是在那里。

相反,你可以做的是不要在服务构造函数中实例化Mongo类,让属性按照你所做的方式被注入到MongoService中,然后创建它作为你的属性后调用的init方法的一部分设置:

在MongoService

public void init(){ 
    mongo = new Mongo(host, port); 
} 

,并在bean的配置:

<bean id="mongoService" class="com.business.persist.MongoService" init-method="init"></bean> 
+0

看到你的更新,你还拥有一个组件-scan在某处,这可能是你的bean的另一个地方正在创建,如果是这样的话,用'@ PostConstruct'注释来注释你的'init'方法 –