如何告诉spring关于spring bean中使用的单例类?

时间:2011-12-18 18:13:29

标签: java spring

我有一个像春天豆:

public class MongoDaoImpl implements MongoDao {
   private static final Mongo mongo = new Mongo(MySettings.INSTANCE.getMongoHost());

}

在我的servlet.xml中,我有:

   <bean id="mongoDao" class="com.abc.dao.MongoDaoImpl">

   </bean>

现在我收到一个错误:

java.lang.NoClassDefFoundError: Could not initialize class MongoDaoImpl
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:126)

MySettings看起来像:

public enum MySettings {
    INSTANCE; 

    private String mongoHost;

    private MySettings() {
       mongoHost = "127.0.0.1";
    }

    public String getMongoHost() {
       return mongoHost;
    }
}

因此,当spring尝试设置MongoDaoImpl时,它会因为MySettings而崩溃。 如果我删除了mongoDaoImpl中的MySettings,只需要硬编码“127.0.0.1”就可以了。

我是否必须在bean中连接MySettings,然后以某种方式告诉MongoDaoImpl呢?

2 个答案:

答案 0 :(得分:0)

我不知道究竟是什么失败(不应该),但你的Mongo实例也应该是一个bean。在xml中声明它,并使用属性占位符,以便您可以使用.properties文件对其进行配置。类似的东西:

<bean id="mongo" class="...Mongo">
    <constructor-arg value="${mongo.host}" />
</bean>

顺便说一下,为什么不使用spring-data-mongodb中的MongoTemplate

答案 1 :(得分:0)

尝试以下任何一项帮助

  1. 检查XML中的完整类/包名是否正确。如果这个工作,那么你应该使用Bozho建议的初始化方法(上面的答案#1)
  2. 从班级中删除静态声明并尝试重新启动弹簧容器
  3. 将日志记录级别更改为debug以获取更多信息