Debug JSF Lifecycle with Custom DebugPhaseListener

This tutorial shows how to debug JSF Lifecycle with a custom DebugPhaseListener. The first place that most developers check for information about where issues are occurring is the application logs. As you are debugging JSF life cycles it can be quite difficult to see in your logs in what phase the errors are occurring. We will show you how you can add some debug information to your logs about the current life cycle events of JSF.


The DebugPhaseListener implements the PhaseListener which gives us 3 methods to override: beforePhase, afterPhase and getPhaseId. We can configure in what phase these methods are called by specifying a PhaseId in the getPhaseId() method. If we specify PhaseId.ANY_PHASE the beforePhase and afterPhase methods are invoked in every phase. We use these methods to add some logging information before and after each phase.

package com.memorynotfound.jsf;

import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;

public class DebugPhaseListener implements PhaseListener {

    public void beforePhase(PhaseEvent event) {
        if (event.getPhaseId() == PhaseId.RESTORE_VIEW) {
            System.out.println("Processing new Request!");
        System.out.println("before - " + event.getPhaseId());

    public void afterPhase(PhaseEvent event) {
        System.out.println("after - " + event.getPhaseId());
        if (event.getPhaseId() == PhaseId.RENDER_RESPONSE) {
            System.out.println("Done with Request!\n");

    public PhaseId getPhaseId() {
        return PhaseId.ANY_PHASE;

Registering the Debug Lifecycle Phase Listener

Before we can use the DebugPhaseListener we must register it in the faces-config.xml. We do this by creating an element of type lifecycle and adding a child element of type phase-listener and providing the fully qualified class name of our DebugPhaseListener.

<faces-config xmlns=""
                        " version="2.2">



Example Output

In this example we access a simple html page without any complex components on the page. We can see that the DebugPhaseListener produced the following output:

Processing new Request!
before - RESTORE_VIEW 1
after - RESTORE_VIEW 1
Done with Request!



You may also like...