Results 1 to 7 of 7

Thread: Injected Session always null (Spring+Hibernate+JBoss)

  1. #1

    Default Injected HibernateTemplate always null (Spring+Hibernate+JBoss)

    Hello again folks I'm trying to get a simple Spring+Hibernate webapp running on a local JBoss server and an Oracle DB. The problem is I keep getting a NullPointerException for my hibernateTemplate object which should come from my injected SessionFactory (which is not null). Anyone seen this before and know why it might be happening?

    Here are my important files:

    qstestapp-servlet.xml
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
    
    <!--
      - Application context definition for "qstestapp" DispatcherServlet.
      -->
    
    <beans>
        <bean id="qstestController" class="com..."/>
    
        <!--  Form Controller for the "Controls" page -->
        <bean id="controlFormController" class="com...">
            <property name="sessionForm"><value>true</value></property>
    	  <property name="formView"><value>priceincrease</value></property>
            <property name="successView"><value>test.htm</value></property>
        </bean>
    
        <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
            <property name="mappings">
                <props>
    		    <prop key="/controls.htm">qstestController</prop>
    		    <prop key="/results.htm">qstestController</prop>
    		    <prop key="/test.htm">qstestController</prop>
    
                </props>
            </property>
        </bean>
    
        <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="viewClass"><value>org.springframework.web.servlet.view.JstlView</value></property>
            <property name="prefix"><value>/WEB-INF/jsp/</value></property>
            <property name="suffix"><value>.jsp</value></property>
        </bean>
    
        <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
       	<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
        	<property name="url" value="jdbc:oracle:thin:@someplace:1521:DMS1_DEV"/>
        	<property name="username" value="user"/>
        	<property name="password" value="pass"/>
        </bean>
    
        <bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        	<property name="dataSource"><ref bean="myDataSource"/></property>
        	<property name="mappingResources">
          <list>
            <value>/WEB-INF/qstestapp.hbm.xml</value>
          </list>
          </property>
          <property name="hibernateProperties">
         	 <value>hibernate.dialect=org.hibernate.dialect.Oracle9Dialect</value>
        	</property>
        </bean>	
    
        <bean id="myQueryManager" class="com...">
        	<property name="sessionFactory" ref="mySessionFactory"/>
        </bean>
    </beans>
    QueryManagerBean.java
    Code:
    package com...;
    
    import java.util.List;
    import org.springframework.orm.hibernate3.HibernateTemplate;
    import org.springframework.orm.hibernate3.HibernateCallback;
    import org.hibernate.Session;
    import org.hibernate.HibernateException;
    import org.hibernate.Query;
    import org.hibernate.SessionFactory;
    import org.springframework.dao.DataAccessException;
    import org.springframework.dao.DataAccessResourceFailureException;
    
    public class QueryManagerBean implements QueryManager {
    
        private HibernateTemplate hibernateTemplate;
    
        public void setSessionFactory(SessionFactory sessionFactory) {
            this.hibernateTemplate = new HibernateTemplate(sessionFactory);
        }
    
        public List getData() throws DataAccessException {
            return (List) this.hibernateTemplate.execute(new HibernateCallback() {
                public Object doInHibernate(Session session) throws HibernateException {
                    Query query = session.createQuery("from SomeObject");
                    return query.list();
                }
            });
        }
    }

    Thanks
    Chris
    Last edited by MonkeyKnifeFight; Feb 7th, 2007 at 02:14 PM.

  2. #2
    Join Date
    Sep 2006
    Location
    UK
    Posts
    8,424

    Default

    Is it possible to see the code that is calling QueryManagerBean. You aren't just creating a new instance of this are you?
    e.g.
    Code:
    QueryManagerBean bean = new QueryManagerBean();

  3. #3

    Default

    You're right that's exactly what i was doing. I tried changing it to instantiate like this:

    Code:
    ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
    qmb = (QueryManagerBean) context.getBean("queryManagerBean");
    But then i got NullPointerException every time for
    Code:
    getServletContext()
    Am i missing something in the configuration files? Here is the actual code i tried:

    Code:
    public class QSTestController extends HttpServlet implements Controller {
    
        /** Logger for this class and subclasses */
        protected final Log logger = LogFactory.getLog(getClass());
    
        public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
    	  ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
    	  QueryManagerBean qmb = (QueryManagerBean) context.getBean("queryManagerBean");
    	  List query = qmb.getData();
    
     	  //Get the name of the page they want.  Request will come in the form of "/*.html" and all i want is the *
    	  StringBuilder sb = new StringBuilder(request.getServletPath());
    	  logger.info("getServletPath() - " + sb.substring(request.getServletPath().indexOf("/") + 1, request.getServletPath().indexOf(".")));
    	
    
    
            return new ModelAndView(sb.substring(request.getServletPath().indexOf("/") + 1, request.getServletPath().indexOf(".")));
        }
    }
    Thanks again
    Chris

  4. #4
    Join Date
    Sep 2006
    Location
    UK
    Posts
    8,424

    Default

    If this is just another bean, why don't you inject the bean in?
    Code:
    public class QSTestController extends HttpServlet implements Controller {
        private QueryManagerBean queryManagerBean;
    
        public void setQueryManagerBean(QueryManagerBean bean) {
            this.queryManagerBean = bean;
        }
    }
    Code:
    <bean id="qstestController" class="com.quinstreet.dms.dds.QSTest.controller.QSTestController">
        <property name="myQueryManager" ref="myQueryManager"/>
    </bean>

  5. #5
    Join Date
    Sep 2004
    Posts
    602

    Default

    Quote Originally Posted by MonkeyKnifeFight View Post
    public class QueryManagerBean implements QueryManager {

    private HibernateTemplate hibernateTemplate;

    public void setSessionFactory(SessionFactory sessionFactory) {
    this.hibernateTemplate = new HibernateTemplate(sessionFactory);
    }
    Your code looks like a prime candidate for extending HibernateDaoSupport giving you access to a ready made hibernate template via getHibernateTemplate()

  6. #6

    Default

    Thanks again karl you were right. I wired the queryManagerBean up to the controller and now i am talking to my database and working like a charm. My mind is slowly starting to work with all the things Spring can help with.

    Paul i actually tried getting it working extending HibernateDaoSupport. Reading around it sounds like using the callback method is preferable to extending HibernateDaoSupport but i haven't quite groked the up/down sides to each method. I guess extending the spring class ties your code in a little closer to spring code but are there other issues? Any information or online articles explaining the differences would be really helpful.

    Thanks for all the help guys,
    Chris

  7. #7
    Join Date
    Sep 2006
    Location
    UK
    Posts
    8,424

    Default

    , ok another problem solved. Glad you're starting to understand more about it. There was another thread talking about DaoSupport recently. It personally think the various DaoSupport classes are useful, but not essential. You are effectively tied either way either extending HibernateDaoSupport or using HibernateTemplate. The reference manual actually shows two examples using HibernateTemplate, one extending HibernateDaoSupport one not. There isn't really that much in it. I personally think that the most useful bit of it all is HibernateTemplate. I would spend some time having a look at the various methods. Your QueryManagerBean code for example could be simplified by using HibernateTemplate.loadAll(..) or HibernateTemplate.find(..).
    http://forum.springframework.org/showthread.php?t=34536
    http://www.springframework.org/docs/...eTemplate.html

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •