2
votes

I'm trying create a composite component to use across my projects, so, I've created a project called "componentes-ui-web" and putted 2 xhtml files that are my components.

The structure of the project is like this:

src
> |-> main
> >       |->java
> >          |->META-INF
> >              |->faces-config.xml
> >              |->resources
> >                    |->componentes
> >                           |->popupSimples.xhtml
> >                           |->popupSubmit.xhtml

This is the code of popupSubmit.xhtml:

<!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:ui="http://java.sun.com/jsf/facelets"
        xmlns:icecore="http://www.icefaces.org/icefaces/core"
        xmlns:ice="http://www.icesoft.com/icefaces/component"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:c="http://java.sun.com/jsp/jstl/core"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:composite="http://java.sun.com/jsf/composite"
        xmlns:ace="http://www.icefaces.org/icefaces/components">
    <composite:interface>
        <composite:attribute name="modal" default="false" />
        <composite:attribute name="visivel" default="false" />
        <composite:attribute name="style" default="" />
        <composite:attribute name="titulo" default="Sem título definido" />
        <composite:attribute name="exibidoQuandoTipoUsuario" default="" />
        <composite:attribute name="metodoFechar"
        method-signature="java.lang.Void fechar()" required="true" />
        <composite:attribute name="metodoSubmeter"
        method-signature="java.lang.Void submeter()" required="true" />
        <composite:facet name="conteudo" />
    </composite:interface>
    <composite:implementation>
        <h:form>
            <ice:panelPopup modal="#{cc.attrs.modal}"
                    renderedOnUserRole="#{cc.attrs.exibidoQuandoTipoUsuario}"
                    draggable="#{cc.attrs.modal}" rendered="#{cc.attrs.visivel}"
                    clientOnly="true" autoCentre="true" style="#{cc.attrs.style}">
                <f:facet name="header">
                    <ui:insert name="barraDeTitulos">
                        <ice:panelLayout layout="flow" style="width:100%">
                            <h:outputText value="#{cc.attrs.titulo}" style="float:left" />
                            <h:commandLink value="[X]" style="float:right"
                                action="#{cc.attrs.metodoFechar}" immediate="true" />
                        </ice:panelLayout>
                    </ui:insert>
                </f:facet>
                <f:facet name="body">
                    <ice:panelLayout layout="flow" style="width:100%">              
                        <composite:renderFacet name="conteudo" />
                        <ui:insert name="barraDeBotoes">
                            <ice:panelLayout layout="flow">
                                <ace:pushButton value="CANCELAR" immediate="true"
                                    style="float:right" action="#{cc.attrs.metodoFechar}" />
                                <ace:pushButton value="OK" style="float:right"
                                    action="#{cc.attrs.metodoSubmeter}" />
                            </ice:panelLayout>
                        </ui:insert>
                    </ice:panelLayout>
                </f:facet>
            </ice:panelPopup>
        </h:form>
    </composite:implementation>
</html>

In another Web project I try to use this component simply adding that jar to the lib (maven) and adding the tag:

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:icecore="http://www.icefaces.org/icefaces/core"
xmlns:ice="http://www.icesoft.com/icefaces/component"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:hrgi="http://java.sun.com/jsf/composite/componentes"
xmlns:ace="http://www.icefaces.org/icefaces/components">
<ui:component>
    <f:loadBundle basename="com.hrgi.web.configuracoes.messages"
    var="configuracoesMsg" />   
        <hrgi:popupSubmit modal="true" visivel="true"
    titulo="#{configuracoesMsg['popup.importador_nfe.titulo']}"
    exibidoQuandoTipoUsuario="ROLE_ADMINISTRADOR"
    metodoFechar="#{controladorPopupConfiguracaoImportadorNFe.fechar}"
    metodoSubmeter="#{controladorPopupConfiguracaoImportadorNFe.submeter}">
    <f:facet name="conteudo">
          ...
    </hrgi:popupSubmit>
</ui:component>
</html>

When I run the application, the component isn't shown and I receive this message in the firefox:

Warning: This page calls for XML namespace http://java.sun.com/jsf/composite/componentes declared with prefix hrgi but no taglibrary exists for that namespace.

What I did wrong??


Update thanks for the replies and sorry for the late to answer...

I've created the ResourceResolver like BalusC told, but without success. I've checked the output of tomcat too, but didn't find any error.

This is my web.xml file, perhaps someone can find anything that could help me. I will search about ResourceHandler too.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
        version="3.0">
    <display-name>teste-zk</display-name>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
        <url-pattern>/icefaces/*</url-pattern>
    </servlet-mapping>

    <context-param>
        <param-name>javax.faces.FACELETS_RESOURCE_RESOLVER</param-name>
        <param-value>com.hrgi.web.ui.FaceletsResourceResolver</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>server</param-value>
    </context-param>
    <context-param>
        <param-name>com.sun.faces.enableMissingResourceLibraryDetection</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
        <param-value>false</param-value>
    </context-param>    
    <servlet>
        <servlet-name>Resource Servlet</servlet-name>
        <servlet-class>com.icesoft.faces.webapp.CompatResourceServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Resource Servlet</servlet-name>
        <url-pattern>/xmlhttp/*</url-pattern>
    </servlet-mapping>
</web-app>
2
Sorry, my resource resolver answer was utterly wrong. It does indeed not apply on composites. I however wonder why it works for composites in our current project. They are not declared in any taglib xml file. They are just put in /META-INF/resources folder of the JAR like as you did (the other important file being /META-INF/faces-config.xml which should be JSF2 compliant. Can you please verify if the JAR builder has included them in the concrete JAR file? You can extract the JAR with a zip tool to verify it.BalusC

2 Answers

6
votes

I've solved the problem. I've looked inside the jar file and didn't see the META-INF/resources folder with the xhtml files. So I changed the META-INF folder from src/main/java to src/main/resources. It worked

0
votes

You should check if the ResourceHandler installed can locate the library and resource (popupSubmit.xhtml) inside you JAR file. Use a ResourceResolver will not help, because it is used for facelets (ui:xxx and facelet views). If there is some ResourceHandler wrapper that prevents locate the library and the resource, or some other problem on the classpath, it is expected the warning you are looking can be seen.