Recuperar as mensagens do contexto em outra página (JSF)

puts galera, comecei a pouco tempo com jsf, mas precisava resolver um problema parecido com o descrito em:
http://www.portaljava.com/home/modules.php?name=Forums&file=viewtopic&t=38865&highlight=messages

estou na pagina X que tem um formulario, clico em incluir por exemplo, ele vai para uma pagina Y onde o usuario deve ler um termo de aceite e aceitar, ao aceitar o sistema envia os dados do formulario para o modelo de negocio, la é feita todas as validações e pode retornar uma exceção, caso retorne exceção, o sistema deve voltar a página X (do formulário) e mostrar os erros.

O que faço é tratar o exception adicionando uma FacesMessage no FacesContext, direcionar o usuário para a página X e nela mostrar as mensagens com h:messages, o problema é que as mensagens não mostram, como se nessa troca de página ele perdeu o que eu inseri no FacesContext… essa navegação é toda feita com navigation-rules

o que está havendo?! tem como fazer isso?! o que estou fazendo de errado?!

Bem, não sei se é a melhor solução, mas usei a solução MultiPageMessagesSupport descrita nesse link:

http://www.jsffaq.com/Wiki.jsp?page=HowToShowFacesMessageOnTheNextPage

porém existia um problema para mensagens que deveriam aparecer na mesma pagina, como ele grava as mensagens na session para adicionar depois novamente ao facescontext, as mensagem que deveriam aparecer na mesma tela apareciam duplicadas, alterei o código la do cara para verificar isso antes de re-adicionar as mensagens no facescontext e funcionou certinho, se alguem tiver o mesmo problema segue o código alterado:

import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;

/**
 * Enables messages to be rendered on different pages from which they were set.
 * To produce this behaviour, this class acts as a <code>PhaseListener</code>.
 * 
 * This is performed by moving the FacesMessage objects:
 * <li>After each phase where messages may be added, this moves the messages
 * from the page-scoped FacesContext to the session-scoped session map.
 * <li>Before messages are rendered, this moves the messages from the
 * session-scoped session map back to the page-scoped FacesContext.
 * 
 * Only messages that are not associated with a particular component are ever
 * moved. These are the only messages that can be rendered on a page that is
 * different from where they originated. * To enable this behaviour, add a
 * <code>lifecycle</code> block to your faces-config.xml file. That block
 * should contain a single <code>phase-listener</code> block containing the
 * fully-qualified classname of this file.
 * 
 * @author <a href="mailto:jesse@odel.on.ca">Jesse Wilson</a>
 * 
 * @version Nos casos em que a mensagem deveria aparecer na mesma página,
 *          ocorria um erro que ele mostrada duas vezes a mesma mensagem, pois
 *          adicionava as mensagens gravadas na session de volta no FacesContext
 *          quando as que já estavam nele não eram apagadas. Foi alterado para
 *          somente adicionar de volta ao FacesMessage as mensagens que não
 *          estiverem nele.
 */
public class MultiPageMessagesSupport implements PhaseListener {

	private static final long serialVersionUID = 3328743500652081238L;

	/** a name to save messages in the session under */
	private static final String sessionToken = "MULTI_PAGE_MESSAGES_SUPPORT";

	/**
	 * Return the identifier of the request processing phase during which this
	 * listener is interested in processing PhaseEvent events.
	 */
	public PhaseId getPhaseId() {
		return PhaseId.ANY_PHASE;
	}

	/**
	 * Handle a notification that the processing for a particular phase of the
	 * request processing lifecycle is about to begin.
	 */
	public void beforePhase(PhaseEvent event) {
		if (event.getPhaseId() == PhaseId.RENDER_RESPONSE) {
			FacesContext facesContext = event.getFacesContext();
			restoreMessages(facesContext);
		}
	}

	/**
	 * Handle a notification that the processing for a particular phase has just
	 * been completed.
	 */
	public void afterPhase(PhaseEvent event) {
		if (event.getPhaseId() == PhaseId.APPLY_REQUEST_VALUES
				|| event.getPhaseId() == PhaseId.PROCESS_VALIDATIONS
				|| event.getPhaseId() == PhaseId.INVOKE_APPLICATION) {
			FacesContext facesContext = event.getFacesContext();
			saveMessages(facesContext);
		}
	}

	/**
	 * Remove the messages that are not associated with any particular component
	 * from the faces context and store them to the user's session.
	 * 
	 * @return the number of removed messages.
	 */
	@SuppressWarnings("unchecked")
	private int saveMessages(FacesContext facesContext) {
		// remove messages from the context
		Set<FacesMessage> messages = new HashSet<FacesMessage>();
		for (Iterator i = facesContext.getMessages(null); i.hasNext();) {
			FacesMessage msg = (FacesMessage) i.next();
			messages.add(msg);
			i.remove();
		}
		// store them in the session
		if (messages.size() == 0)
			return 0;
		Map sessionMap = facesContext.getExternalContext().getSessionMap();
		// if there already are messages
		Set<FacesMessage> existingMessages = (Set<FacesMessage>) sessionMap
				.get(sessionToken);
		if (existingMessages != null) {
			existingMessages.addAll(messages);
			// if these are the first messages
		} else {
			sessionMap.put(sessionToken, messages);
		}
		return messages.size();
	}

	/**
	 * Remove the messages that are not associated with any particular component
	 * from the user's session and add them to the faces context.
	 * 
	 * @return the number of removed messages.
	 */
	@SuppressWarnings("unchecked")
	private int restoreMessages(FacesContext facesContext) {
		// remove messages from the session
		Map sessionMap = facesContext.getExternalContext().getSessionMap();
		Set<FacesMessage> messages = (Set<FacesMessage>) sessionMap
				.remove(sessionToken);
		// store them in the context
		if (messages == null)
			return 0;
		int restoredCount = messages.size();

		// set que contém quais as mensagens que já estão no FacesContext.
		Set<FacesMessage> facesContextMessages = new HashSet<FacesMessage>();
		for (Iterator i = facesContext.getMessages(null); i.hasNext();) {
			FacesMessage msg = (FacesMessage) i.next();
			facesContextMessages.add(msg);
			i.remove();
		}

		// adiciona as que não estão.
		for (FacesMessage facesMessage : messages) {
			if (!facesContextMessages.contains(facesMessage))
				facesContext.addMessage(null, facesMessage);
		}
		return restoredCount;
	}
}