java - session 不会在表单提交时自动传播?

标签 java jsf cdi conversation-scope

我有以下对话范围的支持 bean:

@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;
    }
}

以及以下 facelets View :

<!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: Creating TestConversation bean!!!
INFO: Invoking commandLinkAction

bean 被再次创建,这意味着对话没有被传播。我认为这与以下内容相矛盾:

引自 docs :

The long-running conversation context associated with a request that renders a JSF view is automatically propagated to any faces request (JSF form submission) that originates from that rendered page.

如果我添加这个 <f:param name="cid" value="#{javax.enterprise.context.conversation.id}"/>然后一切正常。我有什么误解吗?

P.S 没有 f:param当我点击 commandLink 时它工作正常第二次,但不是第一次:(。

最佳答案

我想,问题似乎是当 <h:form> 时对话没有开始。组件已处理,因此表单的操作第一次没有包含 cid..

第二次,当你点击一个链接时,testConversation.commandLinkAction , 访问 testConversation在处理 <h:form> 之前开始对话

试试下面的改变

如果你放置 #{testConversation}之前<h:form> 示例工作正常,因为在处理 <h:form> 之前开始对话

希望这有帮助..

关于java - session 不会在表单提交时自动传播?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8552478/

相关文章:

java - 如何优雅地处理Target Unreachable

java - CDI 是否为默认生产者提供 API?

java - 无法加载 mojo 'test' - org.apache.maven.plugins :maven-surefire-plugin:3. 0.0-M1:test

java - 不会说英语以外的语言

java - Response.seeOther 返回空白屏幕

java - 隐藏 p :schedule with css 中的事件

jsf - JSF 2.0中方法调用的方法签名?

asynchronous - 从EJB @Asynchronous调用访问CDI SessionScoped bean

jsf - 是否跨 session 范围的 JSF 支持 bean 观察到 CDI 事件

java - 只访问一次 ConcurrentHashMap<Element, Boolean> 的每个元素的可扩展方式