2010-11-14 57 views
1

我正在研究特定的应用程序,一个spring + hibernate安装程序。我在flex中有一个前端,现在我试图添加一个jstl前端。我得到的延迟初始化异常是当我尝试从jstl模型和视图控制器中调用一个方法时,我从我的flex调用中调用该方法时没有任何问题。spring + jstl + hibernate懒惰初始化异常,如何在Flex前端找到工作

这里是我的web.xml:

<?xml version="1.0" encoding="UTF-8"?> 

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd” 版本= “2.4”>

<display-name>HTML test project</display-name> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>applicationContext.xml</param-value> 
</context-param> 

<listener> 
    <listener-class>com.bamboo.common.factory.Log4JContextListener</listener-class> 
</listener> 

<!--<context-param> 
    <param-name>webAppRootKey</param-name> 
    <param-value>app.root</param-value> 
</context-param> 

<context-param> 
    <param-name>log4jConfigLocation</param-name> 
    <param-value>/WEB-INF/log4j.xml</param-value> 
</context-param> 

<listener> 
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
</listener>--> 

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<!-- Http Flex Session attribute and binding listener support --> 
<listener> 
    <listener-class>flex.messaging.HttpFlexSession</listener-class> 
</listener> 

<servlet> 
    <servlet-name>ApplicationContextFactory</servlet-name> 
    <servlet-class>com.bamboo.common.factory.ApplicationContextFactory</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet> 
    <servlet-name>MessageBrokerServlet</servlet-name> 
    <servlet-class>flex.messaging.MessageBrokerServlet</servlet-class> 
    <init-param> 
     <param-name>services.configuration.file</param-name> 
     <param-value>/WEB-INF/flex/services-config.xml</param-value> 
    </init-param> 
    <load-on-startup>2</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>MessageBrokerServlet</servlet-name> 
    <url-pattern>/messagebroker/*</url-pattern> 
</servlet-mapping> 

<!-- JSTL dispatcher-servlet --> 

<servlet> 
    <servlet-name>dispatcher</servlet-name> 
    <servlet-class> 
     org.springframework.web.servlet.DispatcherServlet 
    </servlet-class> 
    <load-on-startup>2</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>*.htm</url-pattern> 
</servlet-mapping> 

这里我打开我的应用程序上下文,这是我理解的负荷从后端,我会用豆子,把我的Hibernate配置和方面的conf igurations。之后,我加载了弹性消息传递servlet,我知道它允许flex和spring进行通信,最后是调度程序servlet,它将把所有的.htm请求映射到jstl控制器和视图。

这里是我的应用程序上下文:

<?xml version="1.0" encoding="UTF-8"?> 

http://www.springframework.org/schema/beans/spring-beans-2.0.xsd“>

<!-- ========================= GENERAL DEFINITIONS ========================= --> 

<!-- ========================= DATA ACCESS OBJECT DEFINITIONS ======================== --> 

<bean id="dataSource" 
     class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName"> 
     <value>java:comp/env/jdbc/catWDB</value> 
    </property> 
</bean> 

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource"><ref local="dataSource"/></property> 
    <property name="mappingResources"> 
     <list> 
      <value>/com/bamboo/catW3/catW3.hbm.xml</value> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
      <prop key="hibernate.connection.pool_size">3</prop> 
      <prop key="hibernate.show_sql">true</prop> 
     </props> 
    </property> 
</bean> 

<bean id="transactionManager" lazy-init="true" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory"><ref local="sessionFactory"/></property> 
</bean> 

<bean id="categoryDAOTarget" class="com.bamboo.catW3.DAO.impl.CategoryDAOImpl"> 
    <property name="sessionFactory"><ref local="sessionFactory"/></property> 
</bean> 

<bean id="containerDAOTarget" class="com.bamboo.catW3.DAO.impl.ContainerDAOImpl"> 
    <property name="sessionFactory"><ref local="sessionFactory"/></property> 
</bean> 

<bean id="productDAOTarget" class="com.bamboo.catW3.DAO.impl.ProductDAOImpl"> 
    <property name="sessionFactory"><ref local="sessionFactory"/></property> 
</bean> 

<bean id="productOptionDAOTarget" class="com.bamboo.catW3.DAO.impl.ProductOptionDAOImpl"> 
    <property name="sessionFactory"><ref local="sessionFactory"/></property> 
</bean> 

<bean id="productStatusDAOTarget" class="com.bamboo.catW3.DAO.impl.ProductStatusDAOImpl"> 
    <property name="sessionFactory"><ref local="sessionFactory"/></property> 
</bean> 

<bean id="userDAOTarget" class="com.bamboo.catW3.DAO.impl.UserDAOImpl"> 
    <property name="sessionFactory"><ref local="sessionFactory"/></property> 
</bean> 

<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean"> 
    <property name="velocityProperties"> 
     <value> 
      resource.loader=class 
      class.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader 
     </value> 
    </property> 
</bean> 

<!-- ========================= BUSINESS OBJECT DEFINITIONS ======================== --> 

<bean id="catalogFacadeTarget" class="com.bamboo.catW3.business.impl.CatalogFacadeImpl"> 
    <property name="categoryDAO"><ref local="categoryDAOTarget"/></property> 
    <property name="containerDAO"><ref local="containerDAOTarget"/></property> 
    <property name="productDAO"><ref local="productDAOTarget"/></property> 
    <property name="productOptionDAO"><ref local="productOptionDAOTarget"/></property> 
    <property name="productStatusDAO"><ref local="productStatusDAOTarget"/></property> 
    <property name="userDAO"><ref local="userDAOTarget"/></property> 
</bean> 




    <!-- ================================ VIEW RESOLVER ===================================== --> 

     <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> 


<!-- ========================= ASPECT CONFIGURATION ======================== --> 

<bean id="catalogFacade" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
    <property name="transactionManager"> 
     <ref local="transactionManager"/> 
    </property> 
    <property name="target"> 
     <ref local="catalogFacadeTarget"/> 
    </property> 
    <property name="transactionAttributes"> 
     <props> 
      <prop key="add*">PROPAGATION_REQUIRED</prop> 
      <prop key="save*">PROPAGATION_REQUIRED</prop> 
      <prop key="update*">PROPAGATION_REQUIRED</prop> 
      <prop key="delete*">PROPAGATION_REQUIRED</prop> 
      <prop key="remove*">PROPAGATION_REQUIRED</prop> 
      <prop key="get*">PROPAGATION_SUPPORTS,readOnly</prop> 
      <prop key="contains*">PROPAGATION_SUPPORTS,readOnly</prop> 
      <prop key="login*">PROPAGATION_SUPPORTS,readOnly</prop> 
     </props> 
    </property> 
</bean> 

所以我想做的事情,并假设我到现在为止,是共享目录FacadeTarget bean与Flex,并从jstl设置与控制器。因此,我可以调用我从Flex调用相同的方法,现在从控制使用模型和查看方法。我以为这样我就不会遇到任何问题。这里是我的调度员的servlet:

<?xml version="1.0" encoding="UTF-8"?> 

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd“>

<!-- URL mapping --> 
<bean id="urlMap" 
    class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
    <property name="urlMap"> 
     <props> 
     <prop key="/welcome.htm">welcome</prop> 
     <prop key="/welcome">welcome</prop> 
     <prop key="/catalog.htm">catalog</prop> 
     <prop key="/catalog">catalog</prop> 
     </props> 
    </property> 
</bean> 



<!-- Controllers --> 
<bean name="welcome" 
    class="com.bamboo.catW3.business.impl.Welcome"> 
    <property name="successView"> 
     <value>welcome</value> 
    </property> 
    <property name="catalogFacadeImpl" ref="catalogFacadeTarget"/> 
</bean> 
<bean name="catalog" 
     class="com.bamboo.catW3.business.impl.Catalog"> 
     <property name="successView"> 
      <value>catalog</value> 
     </property> 
     <property name="catalogFacadeImpl" ref="catalogFacadeTarget"/> 
</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> 

现在这个工作正常,即使我的intellij IDE强调了catalogFacadeTarget引用,并且说我无法解析bean,这会很棒:如果有人知道如何让他变成并且,也许让我明白了:

<property name="catalogFacadeImpl" ref="*catalogFacadeTarget*"/> 

这是工作的罚款对于那些没有复杂的人际关系简单的物体,比如我有一个不涉及任何表用户,我可以从这样做模型和查看方法在jstl控制器上:

List users = catalogFacadeImpl.getUserList(); 

没问题,我得到用户列表并打印它。但是,如果我尽量让这更复杂的物体上,具有与自身的关系的东西,就像对象类别:

List categories = catalogFacadeImpl.getCategoryList(); 

我得到exceptcion:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.bamboo.catW3.domain.Category.categories, no session or session was closed 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:488) 
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:431) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:690) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 

这通常是hbm和配置关系的问题,然而,这不可能是这样,因为从flex我称这种方法非常相同,并没有任何问题。所以我猜想我并没有像我一样分享这个bean。不,这也不会给我这个错误。

我现在非常困惑,任何有关在哪里寻找的建议都会深表感谢。非常感谢你,试图张贴HBM,以防万一它帮助,但是这个帖子很长。

+0

考虑编辑这个问题。这些问题往往不会被阅读。 – 2010-11-14 22:57:49

+0

未来会记住,得到这个答案,但不是完全阅读。谢谢 – Ernest 2010-11-15 13:41:12

回答

1

我没有读完整个问题,但带有远程前端的LazyInitializationException的解决方案是在通过线路发送集合之前初始化集合。因此,要么:

  • 发送之前定义的所有集合作为EAGER
  • 呼叫Hibernate.initialize(..)

欲了解更多信息,请参阅this answerthis answer。它们是相关的,尽管后者是关于GWT的。

+0

你好Bozho,我得到它的工作感谢您的帖子,所以一百万感谢您的帮助!如果你没有通过你提出的两种解决方案,甚至没有尝试过,因为阅读第二个答案,它建议尝试一个名为OpenSessionInViewFilter的过滤器,它解决了我的问题,甚至认为我不知道它是如何做的它!以及为什么flex前端过去不需要此过滤器。再次遇见你! – Ernest 2010-11-15 13:40:05

0

尝试将@Transactional添加到您的服务方法中。

相关问题