java.lang.IllegalArgumentException:过滤器映射中无效的<url-pattern> [Faces Servlet]

时间:2019-12-18 22:51:46

标签: 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)
    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

当我在类JPAFilter中定义@WebFilter("Faces Servlet")时。我更改为@WebFilter(".xhtml"),但是EntityManager在数据库中创建了很多连接。

我的JPAFilter类:

@WebFilter("Faces Servlet")
public class JPAFilter implements Filter {

    private EntityManagerFactory entityManagerFactory;
    private String persistence_unit_name = "comex-pu";

    public void destroy() {
        this.entityManagerFactory.close();
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        EntityManager entityManager = this.entityManagerFactory.createEntityManager();
        request.setAttribute("entityManager", entityManager);
        entityManager.getTransaction().begin();
        chain.doFilter(request, response);

        try {
            entityManager.getTransaction().commit();
        } catch (Exception e) {
            entityManager.getTransaction().rollback();
        } finally {
            entityManager.close();
        }
    }

    public void init(FilterConfig fConfig) throws ServletException {
        this.entityManagerFactory = Persistence.createEntityManagerFactory(this.persistence_unit_name);
    }
}

我在Faces Servlet中的web.xml

<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>

1 个答案:

答案 0 :(得分:2)

您的错误在这里:

@WebFilter("Faces Servlet")

您将Faces Servlet指定为注释的默认value (即您未将其分配给任何特定的属性名称)。如果您在value的{​​{3}}中查找默认@WebFilter的含义,则请阅读以下内容:

  

value
  过滤器适用的网址格式

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

Invalid <url-pattern> [Faces Servlet] in filter mapping

您基本上是在尝试将servlet名称Faces Servlet指定为URL模式。您需要改为通过servletNames属性指定servlet名称。

@WebFilter(servletNames = { "Faces Servlet" })

那应该解决异常。


但是,这不一定解决您的javadoc的“连接过多”,因为此更改将使您的过滤器的行为仍然与将其配置为@WebFilter("*.xhtml")时的行为完全相同。这是因为Servlet名称"Faces Servlet"是根据web.xml映射到....是的,也是*.xhtml。因此,最终的结果是没有任何区别。

您实际上很可能实际上想跳过过滤器中的JSF资源(CSS / JS /图像资产)。它们即也与*.xhtml URL模式匹配。您需要解决不同的问题。只需让您的过滤器跳过以上下文路径加ResourceHandler.RESOURCE_IDENTIFIER开头的URL即可。将此代码放在您的doFilter()方法的开头。

if (request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) {
    chain.doFilter(request, response);
    return;
}