java.lang.IllegalArgumentException:名为和的servlet都映射到不允许的url-pattern
我试图添加这个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
我已经尝试在web.xml
添加metadata-complete="true"
,但它不再识别该servlet。
引起:java.lang.IllegalArgumentException:名为[ControllerServlet]和[com.classmgt.servlet.ControllerServlet]的servlet都映射到不允许的url-pattern [/ ControllerServlet]
看起来你已经混合了基于@WebServlet
注解和基于web.xml
的configuration。
我怀疑你使用“Create Servlet”向导创build了一个Servlet,该向导使用url-pattern创build了web.xml条目,然后添加了一个@WebServlet
注释,它可以复制任何可能放入web.xml的东西。
你应该使用这一个或另一个,而不是两个。 从web.xml
删除映射,然后只使用@WebServlet
批注。
阅读更多: Servlet 3.0注释和我们的Servlets wiki页面 。
java.lang.IllegalArgumentException: The servlets named...
我在不同的包(name ='syncro')中创build新的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添加正确的path时,错误消失了。 正确的desc如下:
<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!
只需从ControllerServlet
删除注释@WebServlet("/ControllerServlet")
,因为它已经添加到web.xml
。
什么对我来说是干净的。
我的问题是由于Servlet类被重命名造成的。 但是,原始的.class文件保留在目标目录中(使用Servlet注释)。 看起来你已经将你的ControllerServlet移动到一个包中。
docker似乎并不介意这些明显的重复,但Tomcat7给你的“都映射到URL模式”exception。
查看这是否导致您的问题的简单方法是查看WAR以查看旧的类(在您的情况下[ControllerServlet]和[com.classmgt.servlet.ControllerServlet])是否都存在。
至于我,我添加了汤姆猫版本到我的POM文件,它的工作
<properties> <tomcat.version>7.0.52</tomcat.version> </properties> <dependencies>