Warm tip: This article is reproduced from serverfault.com, please click

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

(java - Tomcat 9+: overriding Servlet mapping using @WebServlet annotation)

发布于 2020-12-03 14:25:34

@WebServlet注释与web.xmlservlet映射的优先顺序是什么?更具体地说,我们有一个用例,我们不想修改,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+也会允许这样做吗?
Questioner
Simone Avogadro
Viewed
11
Vsevolod Golovanov 2021-01-13 00:00:56

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

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

因此,规范显然不允许这样做。

替代解决方案:创建一个WebFilter,该WebFilter向前调度到另一个URL,该URL由你的上等servlet处理。或者只是在过滤器本身中做你的事情。