5

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.

Arjan Tijms
  • 37,782
  • 12
  • 108
  • 140
dic19
  • 17,821
  • 6
  • 40
  • 69

2 Answers2

5

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
    Thank you for the links and workaround. I tried and it perfectly works now. However the performance is slightly lesser than disabling ajax as you suggested in your comment. – dic19 Jul 07 '14 at 11:45
  • 1
    Thanks a lot! PF seems to be full of pitfalls like that. – Thomas Jan 20 '16 at 09:13
  • You are welcome. PF may not be 'perfect' but we must be grateful for their tremendous job. –  Nov 12 '17 at 20:53
1

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()}"/>
sara.elkady
  • 29
  • 1
  • 7
  • +1 and thanks for this option. It works and offers a slightly better performance than adding a ``. However I've accepted the other answer because of useful links to the bug report. – dic19 Jul 07 '14 at 11:49