Мы создаем приложение, используя JSF 2, Spring и Hibernate.MyFaces Orchestra используется для предоставления области диалога, которую мы используем для большинства страниц приложения (чтобы воспользоваться преимуществами управления Orchestra сеансом Hibernate).Все наши bean-компоненты объявлены для использования области многообещающего разговора, что (согласно документации Orchestra) должно означать, что bean-компоненты удаляются из области действия, как только пользователь переходит на страницу, которая не содержит ссылок на этот экземпляр вспомогательного компонента..
Проблема, с которой я сталкиваюсь, состоит в том, что, если я перемещаюсь по пути из представления без явного аннулирования диалога, если они возвращаются к этому представлению позже, он все еще имеет те же данные, что и раньше.Я реализовал методы ConversationBindingListener во всех своих компонентах поддержки, и я могу видеть, когда они удаляются из диалога, и я вижу, что они НЕ во многих случаях.
Что делает проблему более запутанной, так это то, чтовспомогательные компоненты удаляются, когда я перехожу на некоторые страницы (просмотры), но не на другие.Я подумал, может быть, это потому, что у страниц была непреднамеренная ссылка на другие компоненты поддержки в EL, но я не смог их найти.Я также подумал, что, возможно, эта проблема возникла только тогда, когда я перешел с одной страницы, на которой находился bean-объект theme.access, на другую страницу, используя другой bean-компонент message.scoped.Однако в тех случаях, когда она удаляется из диалога, на этой странице также содержатся ссылки на bean-объектcope.occess.
Как я уже говорил ранее, явная аннулирование диалога с помощью Conversation.getCurrentInstance (). Invalidate ().работает.Однако явная аннулирование диалога не возможно для каждого варианта использования, поскольку это будет очень распространенный случай, когда пользователь может покинуть представление, просто нажав одну из навигационных ссылок.
ДОПОЛНИТЕЛЬНЫЕ ДАННЫЕ: Мы 'мы использовали Hibernate 3.6 (вместо JPA), поэтому нам пришлось использовать HibernatePersistenceContextFactory .
- MyFaces Orchestra (myfaces-orchestra-core20-1.4.jar)
- JSF 2 (Mojarra 2.0.4)
- Spring 3.0
- PrimeFaces 2.2.1
- RichFaces 4.0.0
Здеськак выглядит моя конфигурация контекста Spring (для Orchestra).
<!-- 1. initialization of all orchestra modules (required for core15 module) -->
<import resource="classpath*:/META-INF/spring-orchestra-init.xml" />
<!-- 2. the conversation scopes -->
<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
<property name="scopes">
<map>
<entry key="conversation.manual">
<bean
class="org.apache.myfaces.orchestra.conversation.spring.SpringConversationScope">
<property name="timeout" value="30" />
<property name="advices">
<list>
<ref bean="persistentContextConversationInterceptor" />
</list>
</property>
</bean>
</entry>
<entry key="conversation.access">
<bean
class="org.apache.myfaces.orchestra.conversation.spring.SpringConversationScope">
<property name="timeout" value="30" />
<property name="advices">
<list>
<ref bean="persistentContextConversationInterceptor" />
</list>
</property>
<property name="lifetime" value="access" />
</bean>
</entry>
</map>
</property>
</bean>
<!-- 3. the "entity manager" manager -->
<bean id="persistentContextConversationInterceptor"
class="org.apache.myfaces.orchestra.conversation.spring.PersistenceContextConversationInterceptor">
<property name="persistenceContextFactory" ref="persistentContextFactory" />
</bean>
<!-- 4. conversation - persistence adapter -->
<bean id="persistentContextFactory"
class="com.acme.infra.orchestra.hibernate.HibernatePersistenceContextFactory">
<property name="entityManagerFactory" ref="sessionFactory" />
</bean>
<!-- 5. persistence -->
<bean id="managedDataSource"
class="org.apache.myfaces.orchestra.connectionManager.ConnectionManagerDataSource">
<property name="dataSource" ref="dataSource" />
</bean>
Вот несколько примеров объявлений компонентов JSF для поддержки.
<bean id="quoteSummaryBackingBean" class="com.acme.ui.backing.QuoteSummaryBackingBean"
scope="conversation.access" orchestra:conversationName="QuoteSummaryConversation">
<property name="quotingBusinessService" ref="quotingBusinessService"/>
<property name="customerBusinessService" ref="customerBusinessService"/>
<property name="referenceDataBusinessService" ref="referenceDataBusinessService"/>
<property name="quoteExportBusinessService" ref="quoteExportBusinessService" />
</bean>
<bean id="createQuoteBackingBean" class="com.acme.ui.backing.CreateQuoteBackingBean"
scope="conversation.access" orchestra:conversationName="CreateQuoteConversation">
<property name="quotingBusinessService" ref="quotingBusinessService"/>
<property name="customerBusinessService" ref="customerBusinessService"/>
<property name="referenceDataBusinessService" ref="referenceDataBusinessService"/>