2013-04-29 6 views
14

Próbowałem dodać aplet tenjava.lang.IllegalArgumentException: The serwlety nazwie [X] i [Y] są odwzorowywane zarówno do URL-wzór [/ url], która jest niedozwolona

package com.classmgt.servlet; 

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

do mojego Eclipse projekt, poprzez edycję web.xml jak poniżej

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

jednak mam następujący wyjątek:

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 

Próbowałem dodać metadata-complete="true" do web.xml, ale nie rozpoznaje już serwletu.

+0

Wygląda na to, że jest dwa serwlety i tego samego url-pattern ale według Twojej web.xml jest tylko jeden , może wront web.xml działa? Spróbuj zrekompilować i uruchomić ponownie? –

+3

Czy miksowano konfigurację opartą na adnotacjach i web.xml? –

+0

w moim ControllerServlet Ja to: '@WebServlet ("/ ControllerServlet")' i na moją postać to co kładę: '

' – John

Odpowiedz

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

Wydaje się, że mają mieszane @WebServlet adnotacji w oparciu i web.xml konfigurację opartą.

Wątpię, aby utworzono serwlet za pomocą kreatora "Utwórz serwlet", który tworzy wpis web.xml ze wzorcem URL, a następnie dodano adnotację @WebServlet, która powiela wszystko, co można umieścić w pliku web.xml.

Powinieneś użyć jednego lub drugiego, nie obu. Usuń mapowanie z web.xml i używaj tylko adnotacji @WebServlet.

Czytaj więcej: Servlet 3.0 Annotations i our Servlets wiki page.

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

Pobrałem tę przyczynę, w której utworzę nowy serwlet w innym pakiecie (name = 'syncro'). Mój aplet się w syncro.SynchronizeServlet A kiedy dodać informacje na temat tego apletu w deskryptorze (web.xml) złapię błąd: IllegalArgumentException

Przykład nieprawidłowego części Eurovoc:

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

Po dodaniu prawidłowej ścieżki do serwletu - błąd zniknął. Prawidłowy opis poniżej:

<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

Co == > 73! ? – domih

+1

Hello! 73 - W amatorskim radiu oznacza "najlepsze życzenia, sukces, powodzenia" –

+0

Dzięki. To zaawansowany typ leetspeaka. – domih

2

Wystarczy usunąć adnotację @WebServlet("/ControllerServlet"), z ControllerServlet, ponieważ została już dodana w web.xml.

0

To, co sprawdziło się, to "czyste".

Mój problem został spowodowany, gdy nazwa klasy serwletu została zmieniona. Jednak oryginalne pliki .class pozostały w katalogu docelowym (wraz z ich adnotacją do Serwletu). Wygląda na to, że przeniosłeś swój ControllerServlet do paczki.

Pomost zdawał się nie przeszkadzać tym pozornym duplikatom, ale Tomcat7 podał twój " " zmapowany na wyjątek adresu URL.

Łatwym sposobem sprawdzenia, czy przyczyną problemu jest sprawdzenie w WAR, czy obie stare klasy (w twoim przypadku [ControllerServlet] i [com.classmgt.servlet.ControllerServlet]) są oba.

0

Jak dla mnie dodałem wersję tom-cat do mojego pliku pom i to działało

<properties> 
    <tomcat.version>7.0.52</tomcat.version> 
</properties> 
<dependencies> 
Powiązane problemy