Tomcat 9+:使用@WebServlet 注释覆盖 Servlet 映射

Tomcat 9+: overriding Servlet mapping using @WebServlet annotation

@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 {
}

所以问题是:

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

If the effective web.xml (after merging information from fragments and annotations) contains any url-patterns that are mapped to multiple servlets then the deployment must fail.

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

替代解决方案:创建一个 WebFilter,它向另一个 url 执行转发分派,由您的重写 servlet 处理。或者只是在过滤器本身做你的事情。