Announcement Announcement Module
Collapse
No announcement yet.
Spring 3.2 + Hibernate 4 OpenSessionInViewFilter Page Title Module
Move Remove Collapse
X
Conversation Detail Module
Collapse
  • Filter
  • Time
  • Show
Clear All
new posts

  • Spring 3.2 + Hibernate 4 OpenSessionInViewFilter

    I'm a Spring newbie trying my first app. My hibernate gets closed before the view is rendered and having problems with lazy loaded properties (expected behavior). I've added the OpenSessionInViewFilter to my web.xml and caused the following:

    Code:
    java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered?
    Beforehand It was working fine with the default servlet context config I've had (can someone tell me why?). So I've added the following:

    Code:
    <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                /WEB-INF/springapp-servlet.xml
        </param-value>
        </context-param>
    
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    The new error went away..but still getting a no session exception from hibernate

    Code:
    org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.test.model.Store.categories, could not initialize proxy - no Session
    I've put a debug message in one of my controllers and it seems that its being initialized 3 times. Maybe I have more than one instance of hibernate session factory bean? My controller methods are marked @Transactional and everything worked until I've attempted to leave the session open to make the lazy fields available for the view.

    My full web.xml (with the new context addition, worked fine without it before I've added the hibernate filter):

    Code:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    
    <web-app version="2.4"
             xmlns="http://java.sun.com/xml/ns/j2ee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
             http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" > 
        <display-name>
          Spring
        </display-name>
        <description>
         Spring Test
        </description>
    
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                /WEB-INF/springapp-servlet.xml
        </param-value>
        </context-param>
    
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    
       <filter>
          <filter-name>hibernateFilter</filter-name>
          <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
          <init-param>
             <param-name>sessionFactoryBeanName</param-name>
             <param-value>sessionFactory</param-value>         
          </init-param>      
       </filter>
    
       <filter-mapping>
         <filter-name>hibernateFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
       </filter-mapping> 
    
      <servlet>
        <servlet-name>springapp</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
      </servlet>
    
    
    
      <servlet-mapping>
        <servlet-name>springapp</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>
    
      <error-page>
        <error-code>500</error-code>
        <location>/error/500</location>
      </error-page>
       <error-page>
        <error-code>404</error-code>
        <location>/resources/pages/error.html</location>
      </error-page>
    
    
    
    </web-app>
    springapp-servlet.xml

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/mvc 
                        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
                        http://www.springframework.org/schema/beans 
                        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
                        http://www.springframework.org/schema/context 
                        http://www.springframework.org/schema/context/spring-context-3.2.xsd
                        http://www.springframework.org/schema/tx
                       http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
                       http://www.springframework.org/schema/aop
                       http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
    
        <context:component-scan base-package="com.test.web.controllers,com.test.service.impl" />
    
        <mvc:annotation-driven />
        <mvc:resources mapping="/resources/**" location="/resources/" /> 
    
        <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/test?zeroDateTimeBehavior=convertToNull"/>
        <property name="username" value="spring"/>
        <property name="password" value="test"/>
      </bean>
    
      <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="myDataSource"/>
        <property name="mappingLocations" value="classpath*:com/test/model/hbm/**/*.hbm.xml" />
    
        <property name="hibernateProperties">
          <value>
            hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
            hibernate.show_sql=true
          </value>
        </property>
      </bean>
    
     <tx:annotation-driven />
      <bean id="transactionManager"
                class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
      </bean>
    
    
        <bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
            <property name="resourceLoaderPath" value="/WEB-INF/templates/"/>
        </bean>
        <bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityLayoutViewResolver">
          <property name="cache" value="true"/>
          <property name="prefix" value=""/>
          <property name="suffix" value=".vm"/>
          <property name="layoutUrl" value="index.vm" />
    
          <!-- if you want to use the Spring Velocity macros, set this property to true -->
          <property name="exposeSpringMacroHelpers" value="true"/>
    
        </bean>
    
         <bean id="multipartResolver"
            class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    
            <!-- one of the properties available; the maximum file size in bytes -->
            <property name="maxUploadSize" value="10000000" />
        </bean>
    
        <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
    
        <bean id="categoryDAO" class="com.test.dao.hibernate.HibernateCategoryDAO">
            <property name="sessionFactory" ref="sessionFactory"></property>
        </bean>
        <bean id="categoryService" class="com.test.service.Categories" scope="singleton">
            <property name="dao" ref="categoryDAO"></property>
        </bean>
        <bean id="storeDAO" class="com.test.dao.hibernate.HibernateStoreDAO">
            <property name="sessionFactory" ref="sessionFactory"></property>
        </bean>
        <bean id="storeService" class="com.test.service.Stores" scope="singleton">
            <property name="dao" ref="storeDAO"></property>
            <property name="categoryDao" ref="categoryDAO"></property>
    
        </bean>
    
    </beans>
    Please help!
Working...
X