Java.lang.IllegalArgumentException: Сервлеты с именем [X] и [Y] отображаются как URL-адрес [/url], который не разрешен - программирование
Подтвердить что ты не робот

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, но он больше не распознает сервлет.

4b9b3361

Ответ 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>