Jsf java.lang.IllegalArgumentException:无效<;url模式>;过滤器映射中的[Faces Servlet]

Jsf java.lang.IllegalArgumentException:无效<;url模式>;过滤器映射中的[Faces Servlet],jsf,servlet-filters,Jsf,Servlet Filters,我正在为我的应用程序中的entityManager构建一个控制过滤器,但出现以下错误: Caused by: java.lang.IllegalArgumentException: Invalid <url-pattern> [Faces Servlet] in filter mapping at org.apache.catalina.core.StandardContext.validateFilterMap(StandardContext.java:3025)

我正在为我的应用程序中的entityManager构建一个控制过滤器,但出现以下错误:

Caused by: java.lang.IllegalArgumentException: Invalid <url-pattern> [Faces Servlet] in filter mapping
    at org.apache.catalina.core.StandardContext.validateFilterMap(StandardContext.java:3025)
    at org.apache.catalina.core.StandardContext.addFilterMap(StandardContext.java:2971)
    at org.apache.catalina.startup.ContextConfig.configureContext(ContextConfig.java:1289)
    at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1169)
    at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:775)
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:301)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5051)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    ... 27 more
我的
web.xml
中面向Servlet

<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>*.xhtml</url-pattern>
</servlet-mapping>

Facesservlet
javax.faces.webapp.FacesServlet
1.
Facesservlet
*.xhtml
您的错误在这里:

@WebFilter("Faces Servlet")
您将
facesservlet
指定为注释的默认
值(即未将其指定给任何特定属性名)。如果您在
@WebFilter
中查找默认
值的含义,则您将阅读以下内容:


筛选器应用到的URL模式

因此,注释的默认值被解释为URL模式。这完全解释了您遇到的异常:

Invalid <url-pattern> [Faces Servlet] in filter mapping
这应该可以解决例外情况


但是,这并不一定能解决“连接太多”的问题,因为此更改将使您的筛选器的行为与您将其配置为
@WebFilter(“*.xhtml”)
时的行为完全相同。这是因为servlet名称
“facesservlet”
根据
web.xml
映射到。。。。是的,还有
*.xhtml
。因此,净效应是没有任何区别

最可能的情况是,您实际上想跳过过滤器中的JSF资源(CSS/JS/image资产)。也就是说,它们也匹配
*.xhtml
URL模式。你需要以不同的方式解决这个问题。只需让过滤器跳过以上下文路径加上ResourceHandler.RESOURCE\u标识符开始的URL即可。将此代码放在
doFilter()
方法的开头

if (request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) {
    chain.doFilter(request, response);
    return;
}
@WebFilter(servletNames = { "Faces Servlet" })
if (request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) {
    chain.doFilter(request, response);
    return;
}