Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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! :)