У меня есть некоторые проблемы при реализации шаблона OpenSessionInView.
Из различных ресурсов в Интернете я настроил свое приложение таким образом:
1) в моем dispatcher-servlet.xml у меня есть перехватчик, который должен получать все мои запросы с помощью весеннего класса OpenSessionInViewInterceptor:
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="openSessionInViewInterceptor"/>
</list>
</property>
<property name="mappings">
<props>
<prop key="index.htm">indexController</prop>
</props>
</property>
</bean>
<bean name="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
<property name="sessionFactory">
<ref bean="sessionFactoryAnnotation"/>
</property>
</bean>
2) затем я настроил транзакции на своем уровне обслуживания с помощью AOP следующим образом:
<aop:config>
<aop:pointcut expression="execution(* it.jdk.crm.service..*Service.*(..))" id="gestioneComunicazioniOperation"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="gestioneComunicazioniOperation"/>
</aop:config>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<bean class="org.springframework.orm.hibernate3.HibernateTransactionManager" id="txManager">
<property name="sessionFactory">
<ref local="sessionFactoryAnnotation" />
</property>
</bean>
<bean class="org.springframework.orm.hibernate3.HibernateTransactionManager" id="txManager">
<property name="sessionFactory">
<ref local="sessionFactoryAnnotation" />
</property>
</bean>
Возможно ли, что две конфигурации находятся в конфликте?
У меня есть требование, чтобы мой уровень Service (используемый в портлетах) был ограничен транзакциями, конфликтует ли он с OpenSessionInView? Если это так, то как я могу предотвратить ошибки LazyInitializationException
в моих контроллерах?
EDIT:
исключение происходит в представлении, когда я звоню
<c:forEach items="${communication.questions}" var="question" >
за исключением
ERROR [jsp:165] org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: it.*.Communication.questions, no session or session was closed
и код в контроллере, который вызывает представление, выглядит так:
@RequestMapping(params="action=dettagli")
public ModelAndView dettagliComunicazione(@ModelAttribute("communication") Communication c) {
Communication communication = null;
try {
communication = communicationService.findById(c.getId());
} catch (Exception ex) {
}
Hashtable l = new Hashtable();
l.put("communication", communication);
return new ModelAndView("communication/details", l);
}
, который разрешается в файле компонентом в dispatcher-servlet.xml:
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" />