jsf - java.lang.IllegalArgumentException:无效过滤器映射中的[Faces Servlet]
问题描述
我正在我的应用程序中为我的 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
当我@WebFilter("Faces Servlet")
在我的类 JPAFilter 中定义时。我改为@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>
解决方案
你的错误在这里:
@WebFilter("Faces Servlet")
您指定Faces Servlet
为注释的默认值value
(即您没有将其分配给任何特定的属性名称)。value
如果您在 的javadoc中查找 default 的含义@WebFilter
,那么您会阅读以下内容:
value
过滤器适用的 URL 模式
因此,注释的默认值被解释为 URL 模式。这完全解释了您遇到的异常:
Invalid <url-pattern> [Faces Servlet] in filter mapping
您基本上是在尝试将 servlet 名称指定Faces Servlet
为 URL 模式。您需要改为通过servletNames
属性指定 servlet 名称。
@WebFilter(servletNames = { "Faces Servlet" })
那应该解决异常。
但是,这不一定能解决您的“连接过多”的XY 问题@WebFilter("*.xhtml")
,因为此更改将使您的过滤器的行为仍然与您将其配置为. 这是因为 servlet 名称"Faces Servlet"
是根据web.xml
映射到 .... 是的,也是*.xhtml
. 所以最终效果是没有任何区别。
很可能您实际上想跳过过滤器中的 JSF 资源(CSS/JS/图像资产)。它们也与*.xhtml
URL 模式匹配。你需要以不同的方式解决这个问题。只需让您的过滤器跳过以 context path plus 开头的 URL ResourceHandler.RESOURCE_IDENTIFIER
。将此代码放在doFilter()
方法的最开头。
if (request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) {
chain.doFilter(request, response);
return;
}
推荐阅读
- python - 如何在字典列表中查找常见的字典
- ios - 如何在滑动时使用 UITableView 执行 Segue?
- git - 文件的 Git 文件状态
- asp.net-core - .Net Core 2.1 在 Web 浏览器中显示静态 JSON 文件
- c# - C# 不会读取 SQL 变量的更新版本
- oracle - 如何在 oracle apex 经典报告中使用 IN 运算符
- python - skimage:定义垂直剪切
- python - 在 tkinter 中将表格居中
- exchange-server - 使用rest api从exchnage获取数据时API HttpError 400(多因素身份验证错误)
- python - 重命名 django 模型中的唯一字段并迁移