2010-08-07 16 views
2

初學者在這裏冬眠,春天。按照這裏的教程安裝hibernae + spring + struts2項目: http://splinter.com.au/blog/?p=224休眠使用查詢通過Spring注入

我想準備查詢。所以我嘗試以下操作: Services.java

public class Services { 
    protected SessionFactory sessionFactory; 
    public void setSessionFactory(SessionFactory value) { 
    sessionFactory = value; 
    } 

    protected Session sess() { 
    return sessionFactory.getCurrentSession(); 
    } 

    private Query query = sess().createQuery("...."); 
} 

爲會話沒有注入以下異常被拋出,我該如何解決?

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'services' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.dao.Services]: Constructor threw exception; nested exception is java.lang.NullPointerException 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:955) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:901) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:574) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425) 
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:276) 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:197) 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47) 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3910) 
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4393) 
    at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeployInternal(TomcatDeployment.java:310) 
    at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeploy(TomcatDeployment.java:142) 
    at org.jboss.web.deployers.AbstractWarDeployment.start(AbstractWarDeployment.java:461) 
    at org.jboss.web.deployers.WebModule.startModule(WebModule.java:118) 
    at org.jboss.web.deployers.WebModule.start(WebModule.java:97) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:157) 
    at org.jboss.mx.server.Invocation.dispatch(Invocation.java:96) 
    at org.jboss.mx.server.Invocation.invoke(Invocation.java:88) 
    at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264) 
    at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:668) 
    at org.jboss.system.microcontainer.ServiceProxy.invoke(ServiceProxy.java:206) 
    at $Proxy38.start(Unknown Source) 
    at org.jboss.system.microcontainer.StartStopLifecycleAction.installAction(StartStopLifecycleAction.java:42) 
    at org.jboss.system.microcontainer.StartStopLifecycleAction.installAction(StartStopLifecycleAction.java:37) 
    at org.jboss.dependency.plugins.action.SimpleControllerContextAction.simpleInstallAction(SimpleControllerContextAction.java:62) 
    at org.jboss.dependency.plugins.action.AccessControllerContextAction.install(AccessControllerContextAction.java:71) 
    at org.jboss.dependency.plugins.AbstractControllerContextActions.install(AbstractControllerContextActions.java:51) 
    at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348) 
    at org.jboss.system.microcontainer.ServiceControllerContext.install(ServiceControllerContext.java:297) 
    at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1633) 
    at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:935) 
    at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1083) 
    at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:985) 
    at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:823) 
    at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553) 
    at org.jboss.system.ServiceController.doChange(ServiceController.java:688) 
    at org.jboss.system.ServiceController.start(ServiceController.java:460) 
    at org.jboss.system.deployers.ServiceDeployer.start(ServiceDeployer.java:163) 
    at org.jboss.system.deployers.ServiceDeployer.deploy(ServiceDeployer.java:99) 
    at org.jboss.system.deployers.ServiceDeployer.deploy(ServiceDeployer.java:46) 
    at org.jboss.deployers.spi.deployer.helpers.AbstractSimpleRealDeployer.internalDeploy(AbstractSimpleRealDeployer.java:62) 
    at org.jboss.deployers.spi.deployer.helpers.AbstractRealDeployer.deploy(AbstractRealDeployer.java:50) 
    at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.java:171) 
    at org.jboss.deployers.plugins.deployers.DeployersImpl.doDeploy(DeployersImpl.java:1440) 
    at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1158) 
    at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1179) 
    at org.jboss.deployers.plugins.deployers.DeployersImpl.install(DeployersImpl.java:1099) 
    at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348) 
    at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1633) 
    at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:935) 
    at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1083) 
    at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:985) 
    at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:823) 
    at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553) 
    at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:782) 
    at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:702) 
    at org.jboss.system.server.profileservice.repository.MainDeployerAdapter.process(MainDeployerAdapter.java:117) 
    at org.jboss.system.server.profileservice.repository.ProfileDeployAction.install(ProfileDeployAction.java:70) 
    at org.jboss.system.server.profileservice.repository.AbstractProfileAction.install(AbstractProfileAction.java:53) 
    at org.jboss.system.server.profileservice.repository.AbstractProfileService.install(AbstractProfileService.java:403) 
    at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348) 
    at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1633) 
    at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:935) 
    at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1083) 
    at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:985) 
    at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:775) 
    at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:540) 
    at org.jboss.system.server.profileservice.repository.AbstractProfileService.registerProfile(AbstractProfileService.java:308) 
    at org.jboss.system.server.profileservice.ProfileServiceBootstrap.start(ProfileServiceBootstrap.java:256) 
    at org.jboss.bootstrap.AbstractServerImpl.start(AbstractServerImpl.java:461) 
    at org.jboss.Main.boot(Main.java:221) 
    at org.jboss.Main$1.run(Main.java:556) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.dao.Services]: Constructor threw exception; nested exception is java.lang.NullPointerException 
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:141) 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:71) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:948) 
    ... 82 more 
Caused by: java.lang.NullPointerException 
    at com.dao.Services.sess(Services.java:36) 
    at com.dao.Services.<init>(Services.java:42) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:126) 
    ... 84 more 

回答

3

Service被實例化時,query字段被初始化。而在這個時候,sessionFactory還沒有被注入,因此NullPointerException

但實際上,初始化QueryService創建時間的整個想法並沒有多大意義,因爲查詢受限於會話的生命週期。從Query的Javadoc:

查詢是通過調用 list()scroll()iterate()執行。查詢 可能會被後續的 調用重新執行。但是,它的使用壽命是 ,由創建它的會話 的生命週期限制。

換句話說,你應該爲每個調用創建Query,不是一勞永逸:

public class Services { 
    protected SessionFactory sessionFactory; 
    public void setSessionFactory(SessionFactory value) { 
     sessionFactory = value; 
    } 

    public List foo() { 
     Query query = sessionFactory.getCurrentSession().createQuery("...."); 
     ... 
    } 
} 
+0

感謝Pascal,我不知道查詢是否綁定到會話。這爲我清除了很多。 – Alkesh 2010-08-07 23:00:10

+0

@Alkesh:不客氣。我可以理解你想要做什麼......但這不是它的工作原理:) – 2010-08-07 23:09:58

0

Services通過默認的構造函數獲取沒有會話工廠的實例。之後,setSession()被Spring調用。 Java嘗試在實例化之後初始化成員query,當時Spring尚未調用setSession()。 您將不得不通過參數化構造函數注入會話工廠,或初始化中的成員query

+0

試圖在的setSessionFactory實例查詢()。出現以下異常 1:org.springframework.beans.MethodInvocationException:屬性'sessionFactory'引發異常;嵌套的異常是org.hibernate.HibernateException:沒有Hibernate Session綁定到線程,並且配置不允許創建非事務性的一個 – Alkesh 2010-08-07 22:42:21