Solucionado (ver solução)
Solucionado
(ver solução)
11
respostas

Exception ao selecionar item do menu (livro ou autor)

Dec 17, 2014 10:52:55 PM com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException SEVERE: Error Rendering View[/autor.xhtml] javax.faces.FacesException: Error loading theme, cannot find "theme.css" resource of "primefaces-" library at org.primefaces.renderkit.HeadRenderer.encodeTheme(HeadRenderer.java:130) at org.primefaces.renderkit.HeadRenderer.encodeBegin(HeadRenderer.java:92) at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:820) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1777) at com.sun.faces.context.PartialViewContextImpl.renderAll(PartialViewContextImpl.java:402) at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:287) at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:183) at javax.faces.component.UIViewRoot.encodeChildren(UIViewRoot.java:978) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779) at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:411) at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:124) at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:744)

11 respostas

Segue trechos importantes do código:

web.xml:

  <context-param>
    <param-name>primefaces.THEME</param-name>
    <param-value>#{temaBean.tema}</param-value>
  </context-param>
</web-app>

TemaBean.java

@ManagedBean
@SessionScoped
public class TemaBean implements Serializable {

    private static final long serialVersionUID = 1L;

    private String tema = "aristo";

    public String getTema( ) {
        return tema;
    }

    public void setTema( String tema ) {
        this.tema = tema;
    }

    public List<String> getTemas( ) {
        return Arrays.asList( "aristo", "black-tie", "blitzer", "bluesky", "casablanca", "cupertino", "dark-hive",
            "dot-luv", "eggplant", "excite-bike", "flick", "glass-x", "hot-sneaks", "humanity", "le-frog",
            "midnight", "mint-choc", "overcast", "pepper-grinder", "redmond", "rocket", "sam", "smoothness",
            "south-street", "start", "sunny", "swanky-purse", "trontastic", "ui-darkness", "ui-lightness", "vader" );
    }
}

Cheguei a achar este tópico ainda sem solução no stack overflow:

http://stackoverflow.com/questions/16122507/primefaces-themeroller-error-when-theme-changed

Você adicionou no seu classpath o all-themes?

Coloquei sim.

Oi Ricardo,

Pode postar o código do xhtml aqui?

Posso sim, Rodrigo.

Segue:

autor.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://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">

    <ui:composition template="_template.xhtml">
        <ui:define name="titulo">
            Novo Autor
        </ui:define>
        <ui:define name="conteudo">
            <h:form id="autor">
                <p:messages id="messages" autoUpdate="true"/>
                <p:growl autoUpdate="true"/>
                <p:fieldset legend="Dados do Autor">
                    <h:panelGrid columns="3">
                        <h:outputLabel value="Nome:" for="nome" />
                        <p:inputText id="nome" value="#{autorBean.autor.nome}" required="true" requiredMessage="Nome obrigatório" validatorMessage="Mínimo de 5 caracteres">
                            <f:validateLength minimum="5"/> 
                        </p:inputText>
                        <p:commandButton value="Gravar" action="#{autorBean.gravar}" />
                    </h:panelGrid>
                </p:fieldset>
            </h:form>
        </ui:define>
        <ui:define name="texto">
            Cadastro de Autores
        </ui:define>
    </ui:composition>
</html>

livro.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://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">

<h:head/>

<ui:composition template="_template.xhtml">
    <ui:define name="titulo">
        Novo Livro
    </ui:define>
    <ui:define name="conteudo">
        <h:form>
            <p:messages id="messages" autoUpdate="true"/>
            <p:growl autoUpdate="true"/>
            <p:fieldset legend="Dados do Livro">
                <h:panelGrid columns="2">

                    <h:outputLabel value="Titulo:" for="titulo" />
                    <p:inputText id="titulo" value="#{livroBean.livro.titulo}" required="true" 
                        requiredMessage="Título obrigatório" validatorMessage="Título não pode ser superior a 40" >
                        <f:validateLength maximum="40"/>
                        <f:ajax event="blur"/>
                    </p:inputText>

                    <h:outputLabel value="ISBN:" for="isbn" />
                    <p:inputMask id="isbn" value="#{livroBean.livro.isbn}" validator="#{livroBean.comecaComDigitoUm}" mask="999-9-99-999999-9"/>
                    <h:outputLabel value="Preço:" for="preco" />
                    <p:inputText id="preco" value="#{livroBean.livro.preco}" validatorMessage="Preço deve estar entre 1,00 e 1.000,00">
                        <f:validateDoubleRange minimum="1.0" maximum="1000.0"/>
                        <f:convertNumber type="currency" pattern="R$ #0.00" currencySymbol="R$" locale="pt_BR"/>
                    </p:inputText>

                    <h:outputLabel value="Data de Lançamento:" for="dataLancamento" />
                    <p:calendar id="dataLancamento" value="#{livroBean.livro.dataLancamento.time}" 
                        pattern="dd/MM/yyyy" timeZone="America/Sao_Paulo"/>
                </h:panelGrid>
            </p:fieldset>

            <p:fieldset legend="Dados do Autor">
                <h:outputLabel value="Selecione " for="autor"/>
                <p:commandLink value=" ou cadastre novo autor" action="#{livroBean.formAutor}" immediate="true"/>
                <br/>
                <p:selectOneMenu value="#{livroBean.autorId}" id="autor">
                    <f:selectItems value="#{livroBean.autores}" var="autor" itemLabel="#{autor.nome}" itemValue="#{autor.id}"/>
                </p:selectOneMenu>
                <br/>
                <br/>
                <p:commandButton value="Gravar Autor" action="#{livroBean.gravarAutor}" process="@this autor" update="tabelaAutores"/>
                <br/>

                <p:dataTable value="#{livroBean.autoresDoLivro}" var="autor" id="tabelaAutores" emptyMessage="Nenhum autor associado">
                    <p:column>
                        <h:outputText value="#{autor.nome}"/>
                    </p:column>
                </p:dataTable>
            </p:fieldset>

            <p:commandButton value="Gravar" action="#{livroBean.gravar}" process="@form" update="@form :tabelaLivros"/>
        </h:form>

        <p:dataTable id="tabelaLivros" value="#{livroBean.livros}" var="livro" paginator="true" rows="4">
            <p:column>
                <f:facet name="header">Título</f:facet>
                <h:outputText value="#{livro.titulo}"/>
            </p:column>

            <p:column>
                <f:facet name="header">ISBN</f:facet>
                <h:outputText value="#{livro.isbn}"/>
            </p:column>

            <p:column>
                <f:facet name="header">Preço</f:facet>
                <h:outputText value="#{livro.preco}">
                    <f:convertNumber type="currency" pattern="R$ #0.00" currencySymbol="R$" locale="pt_BR"/>
                </h:outputText>
            </p:column>

            <p:column>
                <f:facet name="header">Data</f:facet>
                <h:outputText value="#{livro.dataLancamento.time}">
                    <f:convertDateTime pattern="dd/MM/yyyy" timeZone="America/Sao_Paulo"/>
                </h:outputText>
            </p:column>

        </p:dataTable>
    </ui:define>
    <ui:define name="texto">
        Cadastro de Livros
    </ui:define>
</ui:composition>
</html>

_template.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://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.org/ui">

      <h:head/>
      <h:body>
          <div id="cabecalho">
              <h:graphicImage library="img" name="logo.png" />
              <p:themeSwitcher value="#{temaBean.tema}" style="position: absolute; right: 10px">
                  <f:selectItems value="#{temaBean.temas}"/>
                  <f:ajax/>
              </p:themeSwitcher>
              <h:form>
                  <p:menubar>
                      <p:submenu label="Cadastros">
                          <p:menuitem value="Autor" action="autor"/>
                          <p:menuitem value="Livro" action="livro"/>
                      </p:submenu>
                  </p:menubar>
              </h:form>
              <h1><ui:insert name="titulo"></ui:insert></h1>
          </div>

          <div id="conteudo">
              <ui:insert name="conteudo"></ui:insert>
          </div>

          <div id="rodape">
              <hr/>
              <strong><ui:insert name="texto"></ui:insert></strong>
              <br/>copyright 2014
          </div>
      </h:body>
</html>

Oi Ricardo, talvez seja pq o <p:themeSwitcher> não está dentro de um <h:form>.

Conseguiu resolver Ricardo?

Rodrigo, desculpe a demora em responder.

Andei um tempo fora.

O problema persiste. Se coloco o <p:themeSwitcher> dentro do form, ele não aparece na tela.

Reparei que o erro só ocorre na medida em que eu tento chamar o formulário a partir da segunda vez após o deploy.

Muito esquisito.

solução!

Oi Ricardo,

Para funcionar o <p:themeSwitcher> deve estar dentro de um <h:form>:

<div id="cabecalho">
    <h:graphicImage library="img" name="logo.png" />
    <h:form>
        <p:themeSwitcher value="#{temaBean.tema}">
            <f:selectItems value="#{temaBean.temas}" />
            <f:ajax/>
        </p:themeSwitcher>
    </h:form>

    //resto do codigo...

Descobri porque ele não está aparecendo na tela, é por causa do style="position: absolute; right: 10px;". Se você remover esses estilos ele aparece normalmente, em cima da barra de menu.

Matou a charada, Rodrigo.

Muito obrigado.

Abração!

Que bom que resolveu. Bons estudos! :)