在Spring可配置资源的SessionFactory属性中获取null

时间:2014-02-18 17:00:50

标签: java spring hibernate

错误是因为SessionFactory私有专利是空的:

java.lang.NullPointerException
providers.DataProvider.getAll(DataProvider.java:31)
controllers.JSONService.listDepartments(JSONService.java:22)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:185)
com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288)
com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469)
com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400)
com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349)
com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339)
com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

使用SessionFactory的类有这个主体:

@Resource(name="sessionFactory")
protected SessionFactory factory;

protected Class<E> entity;
protected String tableName;

public DataProvider(Class e) {
    this.entity = e;
    this.tableName = entity.getAnnotation(Table.class).name();
}

@Transactional(readOnly = true)
public List<E> getAll() {
    Session s = factory.getCurrentSession(); // The exception rise here.
    return s.createQuery("FROM " + tableName ).list();
}

applicationContext.xml的春豆是:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="models"/>
    <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
        </props>
    </property>
</bean>

我做错了什么?

2 个答案:

答案 0 :(得分:0)

注入目标可以是null的唯一方法是,如果您自己创建了包含它的bean。换句话说,你做了

YourClass instance = new YourClass();

而不是从Spring的ApplicationContext获取托管bean。

否则,Spring将尝试自动装配该字段并在失败时抛出异常。

查看您的代码。


实际上还有其他方法让这个领域保持null,但你真的要努力,所以我怀疑这是发生了什么。

答案 1 :(得分:0)

你要么不告诉Spring从这个类中创建一个bean,要么你没有解析你的applicationContext.xml

对于第一种情况,要么将此类标记为@Component并确保component scan找到它,要么以XML格式声明地定义bean。

对于第二种情况,请阅读有关如何初始化Spring上下文的内容。