0
votes

I am using JSF template with top, left and content views of a chat application. On the left is a list of discussions, displayed using composite components. When I select one discussion, every conversation in the selected discussion is required to the displayed in the content. There is a create button in the content pane which allows to create a new text within the selected discussion. On click of create, a dialog opens to input the message text.

The issue is, when I select a discussion on the left, and then click on the create in the content, the text message from the dialog is passing blank values to the backing bean. The setter method is getting called, but the value passed is blank. I observed that, if I click on create when the page is loaded, without selecting a discussion, it is sending the message with correct value. Every subsequent creates even after selecting a discussion continues to pass the same value.

I am using Primefaces 3.4.2 and glassfish 4.

Below is the center pane xhtml

<h:body>
        <h:form id="newForm">
            <p:commandLink id="test" value="Create Bubble"  />
            <p:overlayPanel id="panel" for="test"  >
                <p:commandButton id="map" icon="ui-icon-map" onclick="map_dlg.show();"/>
                <p:commandButton id="map1" icon="ui-icon-document" onclick="survey_dlgcreate.show();"/>
                <p:commandButton id="map2" icon="ui-icon-folder" onclick="txt_dlg.show();"/>
            </p:overlayPanel>
            <a:discussionComp discussion="#{displayDiscussionBean}"/> 
         </h:form>                    
         <p:focus id="focus" context="textdlg"/>
         <p:dialog id="textdlg" modal="true" header="Text bubble" appendToBody="true" hideEffect="fade" widgetVar="txt_dlg">
                    <h:form id="t3">
                        <p:outputLabel value="Enter your message"/><p:inputText value="#{displayDiscussionBean.txtMsg}"/>
                        <p:commandButton  icon="Post" action="#{displayDiscussionBean.createTextBubble()}" oncomplete="txt_dlg.hide();"/>
                    </h:form>
         </p:dialog>                    
</h:body>

Here is what my left panel is.

<!--IMPLEMENTATION--> 
<cc:implementation>
    <h:form id="leftPanel">
        <p:dataTable id="disc" value="#{cc.attrs.discussionModel}" var="discussion" style="margin-top: 2px;height: 100%"  selectionMode="single" selection="#{discussionBean.selectedDiscussion}" >
            <p:ajax event="rowSelect" update=":detail_panel" />  
            <f:facet name="header">
                Discussions 
                <h:commandLink action="#{discussionBean.createDiscussion()}">
                    <p:graphicImage id="add" url="/resources/images/plus.png" style="height: 25px;float: right" />
                    <p:tooltip for="add" value="Add Discussion" style="font-size: 12px" hideEffect="fade"/>
                </h:commandLink>
            </f:facet>
            <p:column style="font-size: 12px;">  
                #{discussion.title}  
            </p:column>  
        </p:dataTable>
    </h:form>
</cc:implementation>

My backing bean (displayDiscussionBean) for the create is a SessionScoped bean, and has get and set methods for the txtMsg. However on submit, set method gets fired, but with blank value. Below is the backing bean.

@Named
@SessionScoped
public class DisplayDiscussionBean implements Serializable {


    private static final long serialVersionUID = 1L;
    @EJB
    private DiscussionEJB discussionEJB;
    private TextEJB textEJB;
    private DiscussionEntity de;
    private HashMap<Integer, TextEntity> textMap;
    private String selectedOption;
    @Inject
    private DiscussionBean discussionBean;
    private String msg;
    private Integer currentBubbleId;
    private Integer currentBubbleType = 55;
    @Inject
    private Locations loc;
    private String txtMsg;
    private TreeNode root;

    private Integer did;

    public Integer getDid() {
        return did;
    }

    public void setDid(Integer did) {
        this.did = did;
        setDetails();
    }

    public DisplayDiscussionBean() {
    }

    public DisplayDiscussionBean(Integer id) {
    }

    private void setDetails() {
        de = discussionEJB.getDiscussionDetails(did);
        textMap = new HashMap<>();
        root = new DefaultTreeNode("Root", null);
        Map<Integer, TreeNode> nodeMap = new HashMap<>();
        for (BubbleEntity b : de.getBubbleList()) {
            TreeNode node = new DefaultTreeNode(b, null);
            nodeMap.put(b.getBubbleId(), node);
                TextEntity te = (TextEntity) b;
                textMap.put(te.getBubbleId(), te);
        }
        for (BubbleEntity b : de.getBubbleList()) {
            if (b.getParentId() != null) {
                TreeNode currNode = nodeMap.get(b.getBubbleId());
                TreeNode parentNode = nodeMap.get(b.getParentId());
                currNode.setParent(parentNode);
            } else {
                TreeNode currNode = nodeMap.get(b.getBubbleId());
                currNode.setParent(root);
            }

        }
    }  
    public void createTextBubble() {      
        if (did == null){
            did=discussionBean.getSelectedDiscussion().getDiscussionId();            
    }
        textEJB.createTextBubble(txtMsg, did, null);    
    }
    public DiscussionEntity getDe() {
        return de;
    }
    public void setDe(DiscussionEntity de) {
        this.de = de;
    }
    public TreeNode getRoot() {
        return root;
    }
    public void setRoot(TreeNode root) {
        this.root = root;
    }
    public HashMap<Integer, TextEntity> getTextMap() {
        return textMap;
    }
    public void setTextMap(HashMap<Integer, TextEntity> textMap) {
        this.textMap = textMap;
    }
    public String getSelectedOption() {
        return selectedOption;
    }
    public void setSelectedOption(String selectedOption) {
        this.selectedOption = selectedOption;
    }
    public Integer getCurrentBubbleId() {
        return currentBubbleId;
    }
    public void setCurrentBubbleId(Integer currentBubbleId) {
        this.currentBubbleId = currentBubbleId;
    }
    public Integer getCurrentBubbleType() {
        return currentBubbleType;
    }
    public void setCurrentBubbleType(Integer currentBubbleType) {
        this.currentBubbleType = currentBubbleType;
    }
    public String getTxtMsg() {
        return txtMsg;
    }
    public void setTxtMsg(String txtMsg) {
        this.txtMsg = txtMsg;
        System.out.println("set text msg is "+txtMsg);
    }
}

Any suggestioins what am I doing wrong here?

1

1 Answers

0
votes

Try using only one form instead. Remove the inner form. I too had a similar issue and removing inner form worked for me.

If that doesn't work try adding 'process' or 'execute' attribute to your button which calls your bean method