web-dev-qa-db-fra.com

java.lang.IllegalArgumentException: les servlets nommés [X] et [Y] sont tous deux mappés sur le modèle d'URL [/ url] qui n'est pas autorisé

J'ai essayé d'ajouter cette servlet

package com.classmgt.servlet;

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

à mon projet Eclipse, en modifiant le web.xml comme ci-dessous

<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>

Cependant, j'ai eu l'exception suivante:

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

J'ai essayé d'ajouter metadata-complete="true" à web.xml, mais il ne reconnaît plus le servlet.

16
John

Causée par: Java.lang.IllegalArgumentException: les servlets nommés [ControllerServlet] et [com.classmgt.servlet.ControllerServlet] sont tous deux mappés au modèle d'URL [/ ControllerServlet] qui n'est pas autorisé

Il semble que vous ayez mélangé @WebServlet basé sur les annotations et web.xml configuration basée.

Je doute que vous ayez créé un servlet à l'aide de l'assistant "Créer un servlet" qui crée une entrée web.xml avec url-pattern, puis ajouté un @WebServlet annotation qui duplique tout ce que vous pouvez mettre dans le web.xml.

Vous devez utiliser l'un ou l'autre, pas les deux. Supprimez le mappage de web.xml et continuez en utilisant uniquement le @WebServlet annotation.

En savoir plus: Annotations Servlet 3. et notre page wiki Servlets .

33
Hardik Mishra

Supprimez simplement l'annotation @WebServlet("/ControllerServlet"), de ControllerServlet, car elle a déjà été ajoutée dans web.xml.

Java.lang.IllegalArgumentException: The servlets named...

J'ai récupéré cette cause où je crée une nouvelle servlet dans un package différent (nom = 'syncro'). Ma servlet située dans syncro.SynchronizeServlet Et lorsque j'ajoute des informations sur cette servlet dans le descripteur de déploiement (web.xml), j'attrape erreur: IllegalArgumentException

Exemple de partie de descripteur incorrecte:

<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>

Lorsque j'ajoute le chemin correct pour la servlet - l'erreur a disparu. Correct desc ci-dessous:

<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!

2

Ce qui a fonctionné pour moi, c'est de faire un "nettoyage".

Mon problème est survenu lorsque la classe Servlet a été renommée. Cependant, les fichiers .class d'origine sont restés dans le répertoire cible (avec leur annotation Servlet). Il semble que vous ayez déplacé votre ControllerServlet dans un package.

Jetty ne semblait pas s'inquiéter de ces doublons apparents, mais Tomcat7 vous a donné l'exception "tous deux mappés sur le modèle d'URL".

Le moyen facile de voir si cela est à l'origine de votre problème est de regarder dans le WAR pour voir si les anciennes classes (dans votre cas [ControllerServlet] et [com.classmgt.servlet.ControllerServlet]) sont toutes les deux là.

2
KeithJ

Les servlets nommés [Register] et [com.TeamWork.controller.Register] sont tous deux mappés sur le modèle d'URL [/ Register] qui n'est pas autorisé

pour obtenir cette erreur, vous devez supprimer le mappage de votre servlet de web.xml et simplement ajouter l'annotation + l'URL @WebServlet ("/ Register")

<servlet>
     <servlet-name>Register</servlet-name>
     <servlet-class>com.TeamWork.controller</servlet-class>
  </servlet>

puis votre classe de servlet en haut ajoutez celui-ci

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

ça va marcher merci

0
Mani Manu

Quant à moi, j'ai ajouté la version tom-cat à mon fichier pom et cela a fonctionné

<properties>
    <Tomcat.version>7.0.52</Tomcat.version>
</properties>
<dependencies>
0
user1311061