Problemas com JSF + RICHFACES

pessoal, toda vez que eu rodo a minha aplicação, de início tudo
funciona muito bem, mas se eu clico no botão voltar e tento
acessar novamente a mesma págia eu recebo a mensagem abaiso

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: duplicate Id for a component j_id7:j_id11
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)
	org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
	org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
	org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
	org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)

root cause

java.lang.IllegalStateException: duplicate Id for a component j_id7:j_id11
	org.ajax4jsf.application.TreeStructureNode.apply(TreeStructureNode.java:68)
	org.ajax4jsf.application.TreeStructureNode.apply(TreeStructureNode.java:92)
	org.ajax4jsf.application.TreeStructureNode.apply(TreeStructureNode.java:92)
	org.ajax4jsf.application.TreeStructureNode.apply(TreeStructureNode.java:92)
	org.ajax4jsf.application.TreeStructureNode.apply(TreeStructureNode.java:92)
	org.ajax4jsf.application.AjaxStateManager.getTreeStructureToSave(AjaxStateManager.java:187)
	org.ajax4jsf.application.AjaxStateManager.buildViewState(AjaxStateManager.java:498)
	org.ajax4jsf.application.AjaxStateManager.saveSerializedView(AjaxStateManager.java:451)
	com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:615)
	org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:100)
	org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:176)
	com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106)
	com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
	com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:245)
	org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
	org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
	org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
	org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.18 logs.

meu arquivo XHTML esta abaixo


<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:a4j="http://richfaces.org/a4j"
                xmlns:rich="http://richfaces.org/rich"
                template="./template.xhtml">

    <ui:define name="title">
        DARF Normal
    </ui:define>

    <ui:define name="body">
        <h:form>
            <h:panelGrid>
                <p><a href="template-client.jsf">Home</a></p>
            </h:panelGrid>
        </h:form>
        <h:form>
            <h:panelGroup>
                <h:panelGrid id="darfNormal" columns="2">
                    <h:outputLabel value="#{darf.codigoReceita}"/>
                    <h:inputText id="codigoReceitaTributo" binding="#{darfNormalController.codigoReceitaTributoInput}" value="#{darfNormalController.darf.codigoReceitaTributo}"/>
                    <h:outputLabel value="#{darf.tipoContribuinte}"/>
                    <rich:comboBox  id="tipoIdentificacaoContribuinte"
                                    binding="#{darfNormalController.tipoIdentificacaoContribuinteInput}"
                                    value="#{darfNormalController.darf.tipoIdentificacaoContribuinte}"
                                    directInputSuggestions="false">
                        <f:selectItems value="#{darfNormalController.identificacaoList}"/>
                    </rich:comboBox>
                    <h:outputLabel value="#{darf.identificacao}"/>
                    <h:inputText id="identificacaoContribuinte" binding="#{darfNormalController.identificacaoContribuinteInput}" value="#{darfNormalController.darf.identificacaoContribuinte}"/>
                    <h:outputLabel value="#{darf.codigoTributo}"/>
                    <h:inputText id="codigoIdentificacaoTributo" binding="#{darfNormalController.codigoIdentificacaoTributoInput}" value="#{darfNormalController.darf.codigoIdentificacaoTributo}"/>
                    <h:outputLabel value="#{darf.periodoApuracao}"/>
                    <a4j:outputPanel id="darfNormalPeriodoApuracao" layout="block">
                        <rich:calendar id="periodoApuracao"
                                       binding="#{darfNormalController.periodoApuracaoInput}"
                                       value="#{darfNormalController.darf.periodoApuracao}"
                                       popup="#{darf.popupDate}"
                                       datePattern="#{darf.periodoApuracaoPattern}"
                                       showApplyButton="#{darf.showApply}" cellWidth="24px" cellHeight="22px" style="width:200px"/>
                    </a4j:outputPanel>
                    <h:outputLabel value="#{darf.numeroReferencia}"/>
                    <h:inputText id="numeroReferencia" binding="#{darfNormalController.numeroReferenciaInput}" value="#{darfNormalController.darf.numeroReferencia}"/>
                    <h:outputLabel value="#{darf.valorPrincipal}"/>
                    <h:inputText id="valorPrincipal" binding="#{darfNormalController.valorPrincipalInput}" value="#{darfNormalController.darf.valorPrincipal}"/>
                    <h:outputLabel value="#{darf.valorMulta}"/>
                    <h:inputText id="valorMulta" binding="#{darfNormalController.valorMultaInput}" value="#{darfNormalController.darf.valorMulta}"/>
                    <h:outputLabel value="#{darf.valorJurosEncargos}"/>
                    <h:inputText id="valorJurosEncargos" binding="#{darfNormalController.valorJurosEncargosInput}" value="#{darfNormalController.darf.valorJurosEncargos}"/>
                    <h:outputLabel value="#{darf.dataVencimento}"/>
                    <a4j:outputPanel id="darfNormalDataVencimento" layout="block">
                        <rich:calendar id="dataVencimento"
                                       value="#{darfNormalController.darf.dataVencimento}"
                                       binding="#{darfNormalController.dataVencimentoInput}"
                                       popup="#{darf.popupDate}"
                                       datePattern="#{darf.dataVencimentoPattern}"
                                       showApplyButton="#{darf.showApply}" cellWidth="24px" cellHeight="22px" style="width:200px"/>
                    </a4j:outputPanel>
                </h:panelGrid>
                <h:panelGrid id="darfNormalButtons" columns="2">
                    <a4j:commandButton value="Cadastra"
                                       reRender="darfNormal"
                                       action="#{darfNormalController.cadastra}"
                                       style="width:120px; height:30px"
                                       id="botaoCadastrar"/>
                    <a4j:commandButton value="Limpar"
                                       reRender="darfNormal"
                                       action="#{darfNormalController.limpar}"
                                       style="width:120px; height:30px"
                                       id="botaoLimpar"/>
                </h:panelGrid>
            </h:panelGroup>
        </h:form>
    </ui:define>
</ui:composition>

se alguem puder ajudar!!

Olá

Poste o código do seu backing bean para eu dar uma olhada.

Abraço.

Segue o código =)


public class GpsController {

    public List<SelectItem> identificacaoList = new ArrayList<SelectItem>();
    GpsBean bean = new GpsBean();
    Gps gps = bean.getGps();
    List<Gps> lista = bean.getLista();
    private UIInput codigoReceitaTributoInput;
    private HtmlComboBox tipoIdentificacaoContribuinteInput;
    private UIInput identificacaoContribuinteInput;
    private UIInput codigoIdentificacaoTributoInput;
    private UIInput mesAnoCompetenciaInput;
    private UIInput valorPrevistoPagamentoInssInput;
    private UIInput valorOutrasEntidadesInput;
    private UIInput atualizacaoMonetariaInput;
    private HtmlScrollableDataTable tableInput;
    private Selection selection;

    public List<SelectItem> getIdentificacaoList() {
        for (SantanderPagForTributosConcessionariasTipoIdentificacaoContribuinte identificacaoEnum : SantanderPagForTributosConcessionariasTipoIdentificacaoContribuinte.values()) {
            SelectItem item = new SelectItem(identificacaoEnum.getDescricao());
            identificacaoList.add(item);
        }
        return identificacaoList;
    }

    public List<Gps> getLista() {
        return lista;
    }

    public void setLista(List<Gps> lista) {
        this.lista = lista;
    }

    public void setIdentificacaoList(List<SelectItem> identificacaoList) {
        this.identificacaoList = identificacaoList;
    }

    public UIInput getAtualizacaoMonetariaInput() {
        return atualizacaoMonetariaInput;
    }

    public void setAtualizacaoMonetariaInput(UIInput atualizacaoMonetariaInput) {
        this.atualizacaoMonetariaInput = atualizacaoMonetariaInput;
    }

    public UIInput getCodigoIdentificacaoTributoInput() {
        return codigoIdentificacaoTributoInput;
    }

    public void setCodigoIdentificacaoTributoInput(UIInput codigoIdentificacaoTributoInput) {
        this.codigoIdentificacaoTributoInput = codigoIdentificacaoTributoInput;
    }

    public UIInput getCodigoReceitaTributoInput() {
        return codigoReceitaTributoInput;
    }

    public void setCodigoReceitaTributoInput(UIInput codigoReceitaTributoInput) {
        this.codigoReceitaTributoInput = codigoReceitaTributoInput;
    }

    public Gps getGps() {
        return gps;
    }

    public void setGps(Gps gps) {
        this.gps = gps;
    }

    public UIInput getIdentificacaoContribuinteInput() {
        return identificacaoContribuinteInput;
    }

    public void setIdentificacaoContribuinteInput(UIInput identificacaoContribuinteInput) {
        this.identificacaoContribuinteInput = identificacaoContribuinteInput;
    }

    public UIInput getMesAnoCompetenciaInput() {
        return mesAnoCompetenciaInput;
    }

    public void setMesAnoCompetenciaInput(UIInput mesAnoCompetenciaInput) {
        this.mesAnoCompetenciaInput = mesAnoCompetenciaInput;
    }

    public HtmlComboBox getTipoIdentificacaoContribuinteInput() {
        return tipoIdentificacaoContribuinteInput;
    }

    public void setTipoIdentificacaoContribuinteInput(HtmlComboBox tipoIdentificacaoContribuinteInput) {
        this.tipoIdentificacaoContribuinteInput = tipoIdentificacaoContribuinteInput;
    }

    public UIInput getValorOutrasEntidadesInput() {
        return valorOutrasEntidadesInput;
    }

    public void setValorOutrasEntidadesInput(UIInput valorOutrasEntidadesInput) {
        this.valorOutrasEntidadesInput = valorOutrasEntidadesInput;
    }

    public UIInput getValorPrevistoPagamentoInssInput() {
        return valorPrevistoPagamentoInssInput;
    }

    public void setValorPrevistoPagamentoInssInput(UIInput valorPrevistoPagamentoInssInput) {
        this.valorPrevistoPagamentoInssInput = valorPrevistoPagamentoInssInput;
    }

    public GpsBean getBean() {
        return bean;
    }

    public void setBean(GpsBean bean) {
        this.bean = bean;
    }

    public Selection getSelection() {
        return selection;
    }

    public void setSelection(Selection selection) {
        this.selection = selection;
    }

    public HtmlScrollableDataTable getTableInput() {
        return tableInput;
    }

    public void setTableInput(HtmlScrollableDataTable tableInput) {
        this.tableInput = tableInput;
    }

    public void limpar() {
        codigoReceitaTributoInput.setSubmittedValue("");
        tipoIdentificacaoContribuinteInput.setSubmittedValue("");
        identificacaoContribuinteInput.setSubmittedValue("");
        codigoIdentificacaoTributoInput.setSubmittedValue("");
        mesAnoCompetenciaInput.setSubmittedValue("");
        valorPrevistoPagamentoInssInput.setSubmittedValue("");
        valorOutrasEntidadesInput.setSubmittedValue("");
        atualizacaoMonetariaInput.setSubmittedValue("");
    }

    public void cadastra() {
        // bean.salvar();
        this.limpar();
    }
}

nieri, este erro significa que mais de um componente da tua jsp possuem o mesmo id.
É importante lembrar que mesmo que você não defina o atributo id em cada taglib, durante a compilação é gerado automatico, como é o seu caso, e quando você for adicionar uma outra tag, pode ocorrer que duplique esse id. Então, uma boa prática seria você definir todas suas tag (inclusive outputText) com id, pois evita esse tipo de problema.

Olá

Então esse erro de id duplicado caso voce não informe nenhum em seus componentes, realmente é um bug encontrado no JSF, pois uma vez que voce entra na página os componentes são rendenizados e um id é associado a eles e no segundo acesso o bug ocorre porque o JSF se perde na hora de limpar seus componentes duplicados e o id dos mesmos.

Muitas pessoas recomendam assim como o colega acima em sempre atribuir um id a cada componente da página, não deixando assim que o JSF crie o id pra voce.

Caso isso não funcione, tente o seguinte :

No seu método limpar onde voce usou o .setSubmittedValue(""); para cada componente, tire esse métodos e instancie novamente cada componente, pois assim cada vez que voce entrar na pagina o haverá uma instância nova e consequentemente um id novo para o componente.

Um Exemplo :

  
    public void limpar() {   
        componente = new HtmlSelectOneMenu();
        componente2 = new HtmlInputText();
        ...
    } 

Abraço.