5
votes

I'm trying to show a dialog from a bean as described in this PrimeFaces ShowCase. The thing is everything works as expected and dialog shows up, BUT if I close the dialog and then press the button again, the dialog won't show up unless the page is refreshed.

This is not the behavior shown in the example where every time the button is pressed the dialog shows up.

The only difference I have in my code is I have used CDI alternatives instead of managed beans package, because javax.faces.bean package will be deprecated. I mean:

  • javax.inject.Named instead of javax.faces.bean.ManagedBean
  • javax.faces.view.ViewScoped instead of javax.faces.bean.ViewScoped

In any case I've also tried with managed bean package but still the same wrong behavior.

This is what I have so far:

index.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!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:h="http://xmlns.jcp.org/jsf/html"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <p:commandButton value="Open" actionListener="#{viewDialogMB.viewDialog()}"/>
        </h:form>
    </h:body>
</html>

ViewDialogMB.java

import java.util.HashMap;
import java.util.Map;
import javax.faces.view.ViewScoped;
import javax.inject.Named;
import org.primefaces.context.RequestContext;


@Named(value = "viewDialogMB")
@ViewScoped
public class ViewDialogMB {

    public void viewDialog() {
        Map<String,Object> options = new HashMap<>();
        options.put("modal", true);
        options.put("resizable", true);

        RequestContext.getCurrentInstance().openDialog("dialog", options, null);
    }

}

dialog.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!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:h="http://xmlns.jcp.org/jsf/html"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>Dialog Title</title>
    </h:head>
    <h:body>
        <p:outputLabel value="Hello from Dialog!" />
    </h:body>
</html>

faces-config.xml (as per Dialog Framework documentation)

<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="2.2"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd">    
    <application>
        <action-listener>
            org.primefaces.application.DialogActionListener
        </action-listener>
        <navigation-handler>
            org.primefaces.application.DialogNavigationHandler
        </navigation-handler>
        <view-handler>
            org.primefaces.application.DialogViewHandler
        </view-handler>
    </application>
</faces-config>

By the way my platform (if makes any difference) is:

  • Glassfish 4
  • JSF 2.2
  • JDK 1.7 - 64 bits
  • Java EE 7
  • PrimeFaces 5.0 (community version)

I have tried with Mozilla Firefox, Google Chrome and MS IE11.

2
Disable ajax in your commandButton.user2880020

2 Answers

5
votes

This bug was reported here Dialog Framework regression bug in PF 4.0.10 and higher and Issue 6915: PF 5.0 error when closing DF window opened from DataTable

As a workaround solution, use taconic's solution which is to add a panel inside the body.

Your dialog.xhtml would look like this :

<?xml version='1.0' encoding='UTF-8' ?>
<!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:h="http://xmlns.jcp.org/jsf/html"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>Dialog Title</title>
    </h:head>
    <h:body>
    <p:panel>
        <p:outputLabel value="Hello from Dialog!" />
     </p:panel>
    </h:body>
</html>
1
votes

Try using < p:dialog> they are really handy. Or you can do as "dic19" said and disable ajax as follows

<p:commandButton ajax="false" value="Open" actionListener="#{viewDialogMB.viewDialog()}"/>