Длительный компонент CDI ConversationScoped не работает

У меня возникли некоторые проблемы с пониманием области диалога Weld или CDI.

На моей странице JSF Faclets я звоню:

        <f:metadata>
            <f:event type="preRenderView" listener="#{viewBean.start}" />
        </f:metadata>

Боб:

import javax.enterprise.context.Conversation;
import javax.enterprise.context.ConversationScoped;
@Named
@ConversationScoped
public class ViewBean implements Serializable {

@Inject
    private Conversation conversation;

public void start() {
    if (conversation.isTransient()) {
        System.out.println("START CONVERSATION");
        conversation.begin();

    }
}

Теперь каждый раз, когда я обновляю свой браузер, запускается новый разговор. Это правильное поведение? Так почему же разговор всегда преходящ? Никаких исключений не выбрасывается. Beans.xml создан и пуст:

<beans xmlns="http://java.sun.com/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>

person nogamawa    schedule 09.03.2011    source источник


Ответы (1)


Короткий ответ: Да, это правильное поведение.

Длинный ответ: беседа представляет собой "единицу работы", которая должна быть четко разграничена. Это делается с помощью явного вызова talk.begin() - как вы уже делаете. Если вы хотите использовать один и тот же диалог для более чем одного запроса, вы должны распространить его — это то, чего вы не делаете :-)

Когда вы распространяете беседу, к запросу добавляется идентификатор беседы. Это сообщает контейнеру, какой разговор требуется. Когда вы просто нажимаете кнопку обновления без идентификатора разговора в запросе, для каждого запроса создается новый разговор.

Из документации:

Контекст диалога автоматически распространяется с любым запросом лиц JSF (отправка формы JSF) или перенаправлением. Не распространяется автоматически при запросах без лиц, например переход по ссылке.

Если вам нужно распространить его вручную, просто добавьте идентификатор разговора в запрос:

<h:link outcome="/addProduct.xhtml" value="Add Product">
   <f:param name="cid" value="#{javax.enterprise.context.conversation.id}"/>
</h:link>

Все это и многое другое объясняется здесь.

person jan groth    schedule 30.03.2011
comment
@BalusC - о чем эта очистка-редактирование? Что-то не так с моим именем и словом "ура"? Какая-нибудь директива stackoverflow, которую я пропустил, или это ваш личный вкус? Я не уверен в пользе... - person jan groth; 30.03.2011
comment
http://stackoverflow.com/faq › Могу ли я использовать подпись или слоган? Если вы не согласны, принесите его в meta. - person BalusC; 30.03.2011