【问题标题】:java.lang.IllegalArgumentException: The servlets named [X] and [Y] are both mapped to the url-pattern [/url] which is not permittedjava.lang.IllegalArgumentException:名为 [X] 和 [Y] 的 servlet 都映射到不允许的 url 模式 [/url]
【发布时间】:2013-04-22 15:29:25
【问题描述】:

我尝试添加这个 servlet

package com.classmgt.servlet;

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

到我的 Eclipse 项目,如下编辑 web.xml

<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

我尝试将metadata-complete="true" 添加到web.xml,但它不再识别该servlet。

【问题讨论】:

  • 看起来有两个 servlet 和相同的 url 模式,但根据您的 web.xml 只有一个,也许错误的 web.xml 正在运行?尝试重新编译并重新启动?
  • 你是否混合了基于注解和基于 web.xml 的配置?
  • 在我的 ControllerServlet 中我输入了这个:@WebServlet("/ControllerServlet"),在我的表单中我输入了这个:&lt;form action="ControllerServlet" method="POST"&gt;

标签: eclipse tomcat servlets mapping illegalargumentexception


【解决方案1】:

引起:java.lang.IllegalArgumentException:servlet 命名为 [ControllerServlet] 和 [com.classmgt.servlet.ControllerServlet] 是 都映射到 url 模式 [/ControllerServlet] 不是 允许

您似乎混合了基于@WebServlet 注释和基于web.xml 的配置。

我怀疑您是否使用“创建 Servlet”向导创建了一个 Servlet,该向导使用 url-pattern 创建 web.xml 条目,然后添加了一个 @WebServlet 注释,该注释复制了您可能放入 web.xml 中的任何内容。

您应该使用其中一个,而不是两者都使用。从web.xml 中删除映射并继续使用@WebServlet 注释。

阅读更多:Servlet 3.0 Annotationsour Servlets wiki page

【讨论】:

    【解决方案2】:

    只需从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!

      【讨论】:

      • 您好! 73 - 在业余无线电中的意思是“祝福、成功、好运”
      • 谢谢。那是一种高级的 leetpeak。
      【解决方案4】:

      对我有用的是做一个“干净”。

      我的问题是在重命名 Servlet 类时引起的。但是,原始的 .class 文件仍保留在目标目录中(带有它们的 Servlet 注释)。看起来您将 ControllerServlet 移到了一个包中。

      Jetty 似乎并不介意这些明显的重复,但 Tomcat7 给了你的 '都映射到 url-pattern' 异常。

      查看这是否导致您的问题的简单方法是查看 WAR 以查看旧类(在您的情况下为 [ControllerServlet] 和 [com.classmgt.servlet.ControllerServlet])是否都存在。

      【讨论】:

        【解决方案5】:

        对于我来说,我将 tom-cat 版本添加到我的 pom 文件中并且它工作正常

        <properties>
            <tomcat.version>7.0.52</tomcat.version>
        </properties>
        <dependencies>
        

        【讨论】:

          【解决方案6】:

          名为 [Register] 和 [com.TeamWork.controller.Register] 的 servlet 都映射到不允许的 url-pattern [/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 { }
          

          谢谢

          【讨论】:

            猜你喜欢
            • 2016-03-07
            • 1970-01-01
            • 2014-01-22
            • 1970-01-01
            • 2019-12-14
            • 2016-04-28
            • 2016-11-26
            相关资源
            最近更新 更多