java.lang.IllegalArgumentException: Servlet [X]和[Y]都映射到不允许的url-pattern [/url]。

20

我尝试添加这个servlet

package com.classmgt.servlet;

@WebServlet("/ControllerServlet")
public class ControllerServlet extends HttpServlet {}

通过编辑以下内容的 web.xml 文件,将其添加到我的 Eclipse 项目中

<servlet>
    <description>Servlet to print out Hello World!</description>
    <display-name>ControllerServlet</display-name>
    <servlet-name>ControllerServlet</servlet-name>
    <servlet-class>com.classmgt.servlet.ControllerServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ControllerServlet</servlet-name>
    <url-pattern>/ControllerServlet</url-pattern>
</servlet-mapping>

不过,我遇到了以下异常:

SEVERE: A child container failed during start
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/ClassManagementSystem]]
    at java.util.concurrent.FutureTask$Sync.innerGet(Unknown Source)
    at java.util.concurrent.FutureTask.get(Unknown Source)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123)
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:800)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/ClassManagementSystem]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
    ... 7 more
Caused by: java.lang.IllegalArgumentException: The servlets named [ControllerServlet] and [com.classmgt.servlet.ControllerServlet] are both mapped to the url-pattern [/ControllerServlet] which is not permitted
    at org.apache.catalina.deploy.WebXml.addServletMapping(WebXml.java:335)
    at org.apache.catalina.startup.ContextConfig.processAnnotationWebServlet(ContextConfig.java:2457)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2139)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2100)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2093)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2093)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2093)
    at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1300)
    at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:878)
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:369)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5269)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    ... 7 more

我已经尝试在web.xml中添加metadata-complete="true",但它不再识别Servlet。


看起来有两个 servlet 和相同的 url-pattern,但根据你的 web.xml 文件只有一个,可能是错误的 web.xml 在运行?尝试重新编译和重启? - Alexandre Lavoie
5
你是否混合使用了基于注解和基于web.xml的配置? - Jim Garrison
在我的ControllerServlet中,我放置了以下代码: @WebServlet("/ControllerServlet") 而在我的表单中,我放置了以下代码: <form action="ControllerServlet" method="POST"> - Dan
7个回答

38
由于:java.lang.IllegalArgumentException: The servlets named [ControllerServlet] and [com.classmgt.servlet.ControllerServlet] are both mapped to the url-pattern [/ControllerServlet] which is not permitted。
看起来您混合使用了基于@WebServlet注释和web.xml文件的配置。
我怀疑您使用“创建Servlet”向导创建了一个带有url-pattern的web.xml条目,然后添加了@WebServlet注释,这会复制您在web.xml中放置的任何内容。
您应该使用其中一种方法,而不是同时使用两种方法。从web.xml中删除映射,并继续仅使用@WebServlet注释。
阅读更多信息:Servlet 3.0 Annotations我们的Servlets wiki页面

11

ControllerServlet中删除注释@WebServlet("/ControllerServlet"),因为它已经在web.xml中添加了。


3
java.lang.IllegalArgumentException: The servlets named...

我在不同的包(名称为'syncro')中创建新的servlet,因此我提取了这个原因。我的servlet位于syncro.SynchronizeServlet中。当我在部署描述符(web.xml)中添加有关此servlet的信息时,我遇到了错误:IllegalArgumentException

示例不正确的描述符部分:

<servlet>
    <description></description>
    <display-name>SynchronizeServlet</display-name>
    <servlet-name>SynchronizeServlet</servlet-name>
    <servlet-class>SynchronizeServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>SynchronizeServlet</servlet-name>
    <url-pattern>/SynchronizeServlet</url-pattern>
    <url-pattern>/SynServlet</url-pattern>
  </servlet-mapping>

当我为servlet添加正确的路径后,出现的错误就消失了。以下是正确的描述:
<servlet>
    <description></description>
    <display-name>syncro.SynchronizeServlet</display-name>
    <servlet-name>syncro.SynchronizeServlet</servlet-name>
    <servlet-class>syncro.SynchronizeServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>syncro.SynchronizeServlet</servlet-name>
    <url-pattern>/SynchronizeServlet</url-pattern>
    <url-pattern>/SynServlet</url-pattern>
  </servlet-mapping>

==> 73!


1
你好!73 - 在业余无线电中意味着“最好的祝愿,成功,好运”。 - Mikro Koder
谢谢。那是一种高级的Leetspeak类型。 - domih

3
我的解决方法是执行“清洁”操作。
我的问题是由于Servlet类重命名造成的。然而,原始的.class文件仍然存在于目标目录中(带有它们的Servlet注释)。看起来你将你的ControllerServlet移到了一个包中。
Jetty似乎不介意这些明显的副本,但Tomcat7却产生了“两个映射到url-pattern”的异常。
检查WAR文件是否同时存在旧类(在您的情况下为[ControllerServlet]和[com.classmgt.servlet.ControllerServlet])可以很容易地确定这是否会导致问题。

0
对我来说,我在我的pom文件中添加了tom-cat版本,并且它起作用了。
<properties>
    <tomcat.version>7.0.52</tomcat.version>
</properties>
<dependencies>

0

对我来说,这是Intellij Idea中一个意外的错误。

两天前,我删除了一个具有相同URL模式的servlet。然而,我却收到了错误提示,说我的新servlet和那个被删除的具有相同的URL模式。这很奇怪。

  1. 尝试清理Tomcat v10.0.23服务器,
  2. 重新启动服务器,
  3. 构建爆炸式工件,
  4. 重新启动IDE。

什么都不起作用!!

最终,我以调试模式运行项目,问题得到解决。
这很奇怪,但可能是我搞错了什么,所以才遇到了这个问题。

希望这能帮助那些遇到同样问题的人。


0
“Register”和“com.TeamWork.controller.Register”这两个Servlet都映射到了不允许的URL模式“/Register”。如果出现此错误,您需要从web.xml中删除Servlet映射,并只添加@WebServlet(“/Register”)注释+ URL。
<servlet>
     <servlet-name>Register</servlet-name>
     <servlet-class>com.TeamWork.controller</servlet-class>
  </servlet>

然后在你的Servlet类顶部添加这个

@WebServlet("/Register")`
public class Register extends HttpServlet { }

它会起作用的,谢谢


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接