TagException ... null(找不到文件)创建自定义Facelets标记

时间:2014-03-24 00:02:43

标签: jsf java-ee glassfish facelets

我正在创建一个基于JSF 2.2(Mojarra)的应用程序。我正在使用Java EE EAR项目和Eclipse生成的Dynamic Web项目以及Glassfish服务器。

我创建了一个Facelet标记文件,如https://stackoverflow.com/a/5716633/2266635所示。当我加载包含标记的页面时,我收到此错误(以及HTTP 500错误):

2014-03-24T00:32:10.904+0100|WARNING: StandardWrapperValve[Faces Servlet]: Servlet.service() for servlet Faces Servlet threw exception
javax.faces.view.facelets.TagException: /index.xhtml @19,19 <fmk:login-form> null
    at com.sun.faces.facelets.tag.UserTagHandler.apply(UserTagHandler.java:144)
    at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95)
    at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)
    at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:190)
    at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
    at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95)
    at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93)
    at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:87)
    at com.sun.faces.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:161)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.buildView(FaceletViewHandlingStrategy.java:972)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:99)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)

我还尝试在http://www.mkyong.com/jsf2/custom-tags-in-jsf-2-0/逐字复制示例,我仍然收到错误(使用不同的标记)。

UserTagHandler.java第144行的错误是FileNotFoundException。如果我在taglib定义文件中提供了一个无效文件<source>,我会收到同样的错误!因此它永远不会找到带有标记源代码的文件。

以下是文件树的屏幕截图:http://www.fa2k.net/misc/project.png(抱歉,暂不发布内联图片)

相关文件的摘录:

WEB-INF/web.xml

  <context-param>
    <param-name>javax.faces.FACELETS_LIBRARIES</param-name>
    <param-value>/WEB-INF/famake.taglib.xml</param-value>
  </context-param>

WEB-INF/famake.taglib.xml

<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib version="2.2"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facelettaglibrary_2_2.xsd">
    <namespace>http://famake.com/jsf/facelets</namespace>
    <tag>
        <tag-name>login-form</tag-name>
        <source>tags/login-form.xhtml</source>
    </tag>
</facelet-taglib>

WEB-INF/tags/login-form.xhtml

<ui:composition
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets">

    Test tag

</ui:composition>

index.xhtml

...
<html xmlns="http://www.w3.org/1999/xhtml"   
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:fmk="http://famake.com/jsf/facelets">
    <h:body>
        <h1>Custome Tags in JSF 2.0</h1>
        <fmk:login-form/>
    </h:body>
</html>

我不明白为什么Glassfish找不到我的login-form.xhtml。我尝试了不同的路径,甚至尝试了玻璃鱼,但没有任何明智的结果......任何想法可能是错的?

2 个答案:

答案 0 :(得分:0)

问题出在服务器配置中。我找不到原因,但它在另一个Glassfish实例上工作,所以我只是删除了域并重新创建它。对不起,我找不到更具体的内容。

答案 1 :(得分:0)

我遇到了同样的问题,我的项目(Glassfish 4 + Spring + EJB 3 + JSF 2.2 +自定义标签)在我的本地Glassfish和登台服务器上正常运行,但在生产时它抛出异常{{ 1}}。

经过大量调试后我们发现了问题。如果您的Glassfish配置了多个虚拟服务器并且您的项目已部署并与2个或更多相关联,则JSF lib将通过您正在访问它的当前主机名读取源文件,但是对于自定义facelets标记它会通读一个不同的虚拟服务器(可能是一个bug)并抛出TagException: /WEB-INF/templates/common.xhtml @38,33 <app:div> null(由FileNotFoundException压制)。

如果将已部署的项目配置为仅一个虚拟服务器,则不会发生此问题。这就是为什么当你重新创建一个新域时,它起作用了,因为没有额外的虚拟服务器。