CDI ConversationScoped долго работающий Бин не работает - PullRequest
2 голосов
/ 09 марта 2011

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

На моей странице Факультетов JSF я звоню:

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

1 Ответ

5 голосов
/ 30 марта 2011

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

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

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

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

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

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

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

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

...