错误是因为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>
我做错了什么?
答案 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上下文的内容。