p:commandButton导致IllegalStateException

时间:2012-04-29 16:01:06

标签: jsf-2 primefaces

当我点击页面中的p:commandButton

时出现此错误
  

java.lang.IllegalStateException:PWC3999:无法创建会话   提交回复后

按钮采用h:形式,如下所示:

<p:commandButton value="Save" action="#{discussionManager.save}" ajax="false"/>  

但是h:commandButton工作正常:

<h:commandButton value="Save" action="#{discussionManager.save}"/>  (this works)

这是带有方法的bean

@Named
@RequestScoped
public class DiscussionManager {

    private static final Logger logger = Logger.getLogger("DiscussionManager");

    @Inject
    private DiscussionDao discussionDao;

    private Discussion discussion = new Discussion();

    @Produces
    @Named
    @RequestScoped
    public Discussion getDiscussion() {
        return discussion;
    }

    public String save() {
        logger.info("Hello");
        discussionDao.create(discussion);
        return "list";
    }
}

我在发布这个问题之前已经等了一整天,因为我觉得我应该知道如何让这个工作。但是我已经阅读并重新阅读了我的书以及其他一些帖子。我只是不明白为什么它不起作用。

3 个答案:

答案 0 :(得分:1)

我怀疑这是因为bean超出了范围。当您关闭ajax时,它会提交表单,而您实际上正在处理新请求。尝试将范围扩展到视图范围。

答案 1 :(得分:1)

不太确定我改变了什么才能让它正常工作,因为现在整个工作正常。但为了完整起见,这是我页面的相关部分

                <h3>Write your message below</h3>
                <p:editor id="editor" 
                        value="#{discussion.message}" 
                        widgetVar="editor" 
                        width="600"
                        required="true"/>  

                <h:message for="editor"/>                                                

                <h:panelGrid columns="2" style="margin-top:10px">
                    <p:commandButton id="submitButton" value="Save" action="#{discussionManager.save}" ajax="false" icon="ui-icon-disk"/> 
                    <p:commandButton id="clearButton" type="button" value="Clear" onclick="editor.clear()" icon="ui-icon-close" />
                </h:panelGrid>    

这是我的豆子。希望有人觉得这很有用......

@Named
@RequestScoped
public class DiscussionManager implements Serializable {

    private static final Logger logger = Logger.getLogger("DiscussionManager");

    @Inject
    private DiscussionDao discussionDao;

    private Discussion discussion = new Discussion();

    @Produces
    @Named
    @RequestScoped
    public Discussion getDiscussion() {
        return discussion;
    }

    public String save() {
        logger.info("Hello");
        discussionDao.create(discussion);
        return "list";
    }
}

答案 2 :(得分:1)

我无法对你的最终答案发表评论,所以我必须再添加一个答案。我相信你为使你的例子工作所做的是将widgetVar添加到你的编辑器组件中。我也有这个问题。在添加widgetVar行之前,PrimeFaces Demo上的示例将无法正常工作。您需要在onclick调用中引用widgetVar名称而不是id。为清晰起见,我在id和widgetVar之间使用了不同的名称,因此我将编辑器代码更改为:

<h3>Write your message below</h3>
 <p:editor id="editorID" 
        value="#{discussion.message}" 
        widgetVar="editorWidget" 
        width="600"
         required="true"/>  

  <h:message for="editor"/>                                                

<h:panelGrid columns="2" style="margin-top:10px">
    <p:commandButton id="submitButton" value="Save" action="#{discussionManager.save}" ajax="false" icon="ui-icon-disk"/> 
    <p:commandButton id="clearButton" type="button" value="Clear" onclick="editorWidget.clear()" icon="ui-icon-close" />
</h:panelGrid>    

我希望这有助于澄清。