我正在创建一个基于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
。我尝试了不同的路径,甚至尝试了玻璃鱼,但没有任何明智的结果......任何想法可能是错的?
答案 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
压制)。
如果将已部署的项目配置为仅一个虚拟服务器,则不会发生此问题。这就是为什么当你重新创建一个新域时,它起作用了,因为没有额外的虚拟服务器。