18

我试图添加这个 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。

4

6 回答 6

34

原因:java.lang.IllegalArgumentException:名为 [ControllerServlet] 和 [com.classmgt.servlet.ControllerServlet] 的 servlet 都映射到不允许的 url 模式 [/ControllerServlet]

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

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

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

阅读更多:Servlet 3.0 注释我们的 Servlets wiki 页面

于 2013-04-29T11:25:49.440 回答
9

只需从 中删除注释@WebServlet("/ControllerServlet")ControllerServlet因为它已经添加到web.xml.

于 2016-06-13T21:55:13.420 回答
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!

于 2015-05-01T17:53:26.473 回答
3

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

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

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

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

于 2016-08-11T23:03:12.377 回答
0

至于我,我将 tom-cat 版本添加到我的 pom 文件中并且它有效

<properties>
    <tomcat.version>7.0.52</tomcat.version>
</properties>
<dependencies>
于 2016-08-29T09:52:10.710 回答
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 { }

它会工作谢谢

于 2019-11-06T09:12:00.937 回答