【问题标题】:Tomcat 9+: overriding Servlet mapping using @WebServlet annotationTomcat 9+:使用 @WebServlet 注释覆盖 Servlet 映射
【发布时间】:2026-01-26 21:00:02
【问题描述】:

@WebServlet 注解与web.xml servlet 映射的优先顺序是什么? 更具体地说,我们有一个用例,我们宁愿不修改web.xml,但需要覆盖其中一个 servlet 映射。 我们的web.xml 是这样的:

<servlet>
   <servlet-name>foo</servlet-name>
   <servlet-class>com.whatever.simple.foo</servlet-class>
</servlet>
<servlet-mapping>
   <servlet-name>foo</servlet-name>
   <url-pattern>/foo/*</url-pattern>
</servlet-mapping>

我们正在考虑使用以下方法覆盖它:

@WebServlet("/foo/*")
public class OurCustomImplementation extends HttpServlet {
}

所以问题是:

  • 规范是否允许我们为此添加一些参数(例如覆盖或优先参数)?
  • 是规范保证我们的类将始终覆盖web.xml
  • Tomcat 9+ 是否允许这样做,即使可能使用一些扩展?

【问题讨论】:

    标签: java tomcat servlets tomcat9


    【解决方案1】:

    Servlet 3.1 Final 和 4.0.Final 规范都在 12.2 映射规范中说:

    如果有效的web.xml(从片段和信息合并后 annotations) 包含映射到多个 servlet 的任何 url 模式,则部署必须失败。

    所以规范显然不允许这样做。

    替代解决方案:创建一个 WebFilter,它将转发调度到您的覆盖 servlet 处理的另一个 url。或者只是在过滤器本身中做你的事情。

    【讨论】:

    • @WebFilter 选项适用于我们的目的