2013-04-29 8 views
14

ho cercato di aggiungere questo servletjava.lang.IllegalArgumentException: I servlet di nome [X] e [Y] sono entrambi mappati al url-pattern [/ url] che non è permesso

package com.classmgt.servlet; 

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

alla mia progetto Eclipse, modificando il web.xml come di seguito

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

Tuttavia, ho ottenuto la seguente eccezione:

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 

Ho provato ad aggiungere metadata-complete="true" a web.xml, ma non riconosce più il servlet.

+0

Sembra che ci sono due servlet e la stessa url-pattern, ma secondo il vostro web.xml c'è solo un , forse wront web.xml è in esecuzione? Prova a ricompilare e riavviare? –

+3

Hai mescolato la configurazione basata su annotazioni e web.xml? –

+0

all'interno del mio ControllerServlet ho messo questo: '@WebServlet ("/ControllerServlet ")' e nella mia forma questo è quello che ho messo: '

' – John

risposta

28

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

Sembra che aver mescolato @WebServlet annotazioni based e web.xml configurazione basata.

Dubito che tu abbia creato un servlet utilizzando la procedura guidata "Crea servlet" che crea una voce web.xml con url-pattern e quindi, aggiunta un'annotazione @WebServlet che duplica qualsiasi cosa tu possa inserire nel web.xml.

È necessario utilizzare l'uno o l'altro, non entrambi. Rimuovere la mappatura da web.xml e proseguire con l'utilizzo dell'annotazione @WebServlet.

Ulteriori informazioni: Servlet 3.0 Annotations e our Servlets wiki page.

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

Ho recuperato questa causa dove creo un nuovo servlet in un pacchetto diverso (name = 'syncro'). Il mio servlet trova nel syncro.SynchronizeServlet E quando aggiungo le informazioni su questa servlet nel descrittore di deployment (web.xml) Io prendo errore: IllegalArgumentException

Esempio di parte descrittore non corretta:

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

Quando aggiungo il percorso corretto per la servlet - l'errore è scomparso. Corretta descrizione:

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

+0

What's == > 73! ? – domih

+1

Ciao! 73 - In radio amatoriale significa "con i migliori auguri, successo, buona fortuna" –

+0

Grazie. Questo è un tipo avanzato di leetspeak. – domih

2

Basta rimuovere l'annotazione @WebServlet("/ControllerServlet"), dal ControllerServlet, perché già aggiunto nello web.xml.

0

Ciò che ha funzionato per me è un "pulito".

Il mio problema è stato causato quando la classe servlet è stata rinominata. Tuttavia, i file .class originali rimanevano nella directory di destinazione (con le loro annotazioni Servlet). Sembra che tu abbia spostato ControllerServlet in un pacchetto.

A Jetty non sembra interessare questi duplicati apparenti, ma Tomcat7 ha assegnato l'' ' all'eccezione 'url-pattern'.

Il modo semplice per vedere se questo causa il problema è cercare in WAR per vedere se entrambe le vecchie classi (nel tuo caso [ControllerServlet] e [com.classmgt.servlet.ControllerServlet]) sono entrambe lì.

0

Per quanto mi riguarda ho aggiunto la versione tom-cat al mio file pom e ha funzionato

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