导致会话ID增加的原因

时间:2012-05-04 13:17:27

标签: java jsf-2 cdi jboss-weld conversation-scope

我正在尝试跟踪我的CDI对话问题。我有一个页面,如果我通过我的应用程序采取一条路线,但不是如果我通过另一个。我认为这与谈话有关,但我无法弄清楚是什么。

工作流程如下所示:

  1. 加载第A页
  2. 打开编辑页面A
  3. 此时,新会话开始时ID为1
  4. 进行编辑并保存,返回第A页
  5. 点击第A页上的链接以加载第B页
  6. 打开编辑页面B
  7. 会话以ID 2开始。在此开始时按刷新将启动ID为3的会话。其他刷新会增加会话ID。
  8. 编辑成功发生
  9. 不起作用的工作流程如下: 工作流程如下所示:

    1. 加载第A页
    2. 点击第A页上的链接以加载第B页
    3. 打开编辑页面B
    4. 会话以ID 1开始。刷新页面会告诉我对话ID仍为1。
    5. 页面上的各种操作会抛出“WELD-000321没有找到要恢复为id 1的对话”例外。
    6. 因此,两个工作流程之间的差异在于,在工作流程中,我进行了成功的编辑工作。当我在第二个编辑页面上时,我会获得增量对话ID。不工作的工作流程,会话ID总是1,但我什么也做不了!

      我想要了解的事情是:

      1. 如果我的ID为1的对话,请做一些事情然后结束对话,当我开始一个新的对话时 - 它的ID是什么? 1(此会话结束时)或2(下一个未使用的ID)。
      2. 除了谈话没有正确结束之外还有什么想要我正在看的增量对话ID吗?据我所知,我正在正确地结束谈话。
      3. 希望其中一个答案可以解决出错的问题。感谢您的任何输入

1 个答案:

答案 0 :(得分:0)

从你写的内容来看,听起来就像是对话的启动和传播有问题。如果没有您描述的问题,用例肯定是可以实现的。您可能想在此处发布一些相关代码。

  

如果我的ID为1的对话,请执行某些操作然后结束   谈话,当我开始一个新的对话时 - 它的ID是什么?   1(此会话结束时)或2(下一个未使用的ID)。

未指定CDI创建新ID的方式。 Weld做了以下事情:

public class ConversationIdGenerator implements Callable<String>, Serializable {

    public static final String CONVERSATION_ID_GENERATOR_ATTRIBUTE_NAME = ConversationIdGenerator.class.getName();

    private static final long serialVersionUID = 8489811313900825684L;

    // The next conversation ID
    private final AtomicInteger id;

    /**
     * Creates a new conversation ID generator
     */
    public ConversationIdGenerator() {
        this.id = new AtomicInteger(1);
    }

    public String call() {
        int nextId = id.getAndIncrement();
        return String.valueOf(nextId);
    }

}
  

除了谈话没有正确结束之外还有什么东西   我希望增加对话ID   看见了什么?据我所知,我正在正确地结束谈话。

不,这里没有你遗漏的东西。很可能问题出在你的代码中(这是个好消息,因为你可以改变它: - )