Разговор не распространяется автоматически при отправке формы? - PullRequest
1 голос
/ 18 декабря 2011

У меня есть следующий боб области поддержки беседы:

@Named
@ConversationScoped
public class TestConversation implements Serializable {

    private Logger logger = LoggerFactory.getLogger(TestConversation.class);

    private List<Integer> numbers;

    @Inject
    private Conversation conversation;

    @PostConstruct
    public void init() {
        logger.info("Creating TestConversation bean!!!");

        numbers = new ArrayList<Integer>();
        numbers.add(3);
        numbers.add(4);
        numbers.add(5);
        numbers.add(6);

        conversation.begin();        
    }

    public void commandLinkAction() {
        logger.info("Invoking commandLinkAction");
    }

    public List<Integer> getNumbers() {
        return numbers;
    }
}

И следующий вид фасетов:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">

    <h:head>
        <title>Testing Conversation</title>        
    </h:head>

    <h:body>
        <h:form>
            <h:dataTable value="#{testConversation.numbers}" var="num">
                <h:column>                    
                    <h:outputText value="#{num}"/>
                </h:column>
                <h:column>                    
                    <h:commandLink action="#{testConversation.commandLinkAction}">Trigger form submission</h:commandLink>
                </h:column>
            </h:dataTable>
        </h:form>
    </h:body>
</html>

Когда я захожу на страницу, я вижу INFO: Creating TestConversation bean!!!, что правильно.

Но затем я нажимаю h:commandLink и вижу:

INFO: Создание bean-компонента TestConversation !!!
INFO: Вызов команды commandLinkAction

Бин был создан снова, что означает, что разговор не распространялся.Я думаю, что это противоречит следующему:

Цитата из docs :

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

Если я добавлю это <f:param name="cid" value="#{javax.enterprise.context.conversation.id}"/>, тогда все будет работать нормально.Есть ли у меня недопонимание?

PS Без f:param нормально работает, когда я нажимаю на commandLink во второй раз, но не в первый раз: (.

Ответы [ 2 ]

3 голосов
/ 06 января 2012

Думаю, проблема в том, что разговор не был запущен, когда компонент <h:form> был обработан, поэтому в действии формы не было cid в нем в первый раз.

Во второй раз, когда вы нажимаете на ссылку testConversation.commandLinkAction, доступ к testConversation заставил начать разговор до обработки <h:form>

попробуйте изменить ниже

Если вы разместите #{testConversation} до <h:form> пример работает нормально, так как перед обработкой <h:form>

начинается конвекция

Надеюсь, это поможет ..

2 голосов
/ 06 января 2012

Опираясь на предыдущий ответ, это определенно потому, что bean-компонент TestConversation не создается, пока не станет слишком поздно для формы автоматически включать cid.

В этом случае вы инициализируете данные для представления, поэтому лучше вместо этого поместить их в прослушиватель событий preRenderView.

<f:event type="preRenderView" listener="#{testConversation.init}"/>

Поместите это раньше в свой шаблон лицевой стороны, такой как f:metadata (как это часто используется в сочетании с f:viewParam), и удалите аннотацию @PostConstruct. Это делает вызов init явным, а не полагается на то, что он запускается как побочный эффект конструируемого компонента, поскольку на него ссылаются в выражении EL.

...