Java.lang.IllegalArgumentException: Сервлеты с именем [X] и [Y] отображаются как URL-адрес [/url], который не разрешен
Я попытался добавить этот сервлет
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
, но он больше не распознает сервлет.
Ответы
Ответ 1
Вызвано: java.lang.IllegalArgumentException: Сервлеты, названные [ControllerServlet] и [com.classmgt.servlet.ControllerServlet] являются оба сопоставлены с шаблоном url [/ControllerServlet], который не является разрешено
Кажется, что вы создали смешанную @WebServlet
основанную на аннотации и web.xml
конфигурацию.
Я сомневаюсь, что вы создали сервлет с помощью мастера "Create Servlet", который создает запись web.xml с url-образцом, а затем добавляет аннотацию @WebServlet
, которая дублирует все, что вы можете поместить в web.xml.
Вы должны использовать тот или иной, а не тот и другой. Удалите отображение из web.xml
и продолжайте использовать только аннотацию @WebServlet
.
Подробнее: Сервлет 3.0 Аннотации и наша страница вики-сервлетов.
Ответ 2
java.lang.IllegalArgumentException: The servlets named...
Я вызвал эту причину, когда создаю новый сервлет в другом пакете (name= 'syncro'). Мой сервлет находится в syncro.SynchronizeServlet
И когда я добавляю информацию об этом сервлете в дескрипторе развертывания (web.xml), я ломаю ошибку: 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>
<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!
Ответ 3
Просто удалите аннотацию @WebServlet("/ControllerServlet")
из ControllerServlet
, потому что она уже добавлена в web.xml
.
Ответ 4
То, что сработало для меня, - это "чистый".
Моя проблема возникла, когда класс Servlet был переименован. Однако исходные файлы .class остались в целевом каталоге (с их аннотацией Servlet). Похоже, вы перенесли ControllerServlet в пакет.
Jetty, похоже, не возражал против этих очевидных дубликатов, но Tomcat7 дал вам
'оба отображаются в исключение url-шаблона.
Легкий способ убедиться, что это вызывает вашу проблему, - это посмотреть в WAR, чтобы убедиться, что оба старых класса (в вашем случае [ControllerServlet] и [com.classmgt.servlet.ControllerServlet]) находятся там.
Ответ 5
Что касается меня, я добавил версию tom-cat в мой файл pom и работал
<properties>
<tomcat.version>7.0.52</tomcat.version>
</properties>
<dependencies>