java.lang.IllegalArgumentException: не удалось зарегистрировать сервлет с именем "dispatcher". Проверьте, есть ли другой сервлет, зарегистрированный под тем же именем

Мой класс инициализатора

public class HomeServlet extends 
AbstractAnnotationConfigDispatcherServletInitializer{

@Override
protected Class<?>[] getRootConfigClasses() {

    return null;
}

@Override
protected Class<?>[] getServletConfigClasses() {

    return new Class<?>[]{SpringContextConfig1.class};
}

@Override
protected String[] getServletMappings() {

    return new String[] {"/home"};
}

}

Класс конфигурации

@ComponentScan(basePackages={"spittr.controllers"})
@Configuration
@EnableWebMvc
public class SpringContextConfig1 extends WebMvcConfigurerAdapter{

@Bean
public ViewResolver getViewResolver(){
    InternalResourceViewResolver ivr=new InternalResourceViewResolver();
    ivr.setPrefix("/WEB-INF/jsp/");
    ivr.setSuffix(".jsp");
    ivr.setExposeContextBeansAsAttributes(true);
    return ivr;
}

}

контроллер

@Controller
public class HomeController {


@RequestMapping(value="/home",method=RequestMethod.GET)
public String home(){
    return "home";
}

}

Это очень простая программа, которую я написал для тестирования JavaConfig Spring MVC. Я точно выполнил все шаги из книги "Spring in Action".

Когда я запускаю этот код, я получаю эту ошибку

09:41:37,854 ОШИБКА [org.jboss.msc.service.fail] (Пул потоков ServerService - 72) MSC000001: Не удалось запустить службу jboss.undertow.deployment.default-server.default-host./spittr: org.jboss.msc.service.StartException в службе jboss.undertow.deployment.default-server.default-host./spittr: java.lang.RuntimeException: java.lang.IllegalArgumentException: не удалось зарегистрировать сервлет с именем "dispatcher". Проверить есть другой сервлет, зарегистрированный под тем же именем. в org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:85) в java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) в java.util.concurrent. выполнить (FutureTask.java:266) в java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) в java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.javaThlanutor at javaTh6g at at).run(Thread.java:745) в org.jboss.threads.JBossThread.run(JBossThread.java:320) Причина: java.lang.RuntimeException: java.lang.IllegalArgumentException: не удалось зарегистрировать сервлет с именем "диспетчер".Проверьте, есть ли другой сервлет, зарегистрированный под тем же именем. по адресу io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:236) по адресу org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:wunder.j.w.wde.wde.de.de.de.dep.de..UndertowDeploymentService$1.run(UndertowDeploymentService.java:82) ... еще 6 причин: java.lang.IllegalArgumentException: не удалось зарегистрировать сервлет с именем dispatcher.Check, если существует другой сервлет, зарегистрированный под тем же именем. по адресу org.springframework.util.Assert.notNull(Assert.java:115) по адресу org.springframework.web.servlet.support.AbstractDispatcherServletInitializer.registerDispatcherServlet(AbstractDispatcherServletInitializer.ortervpatweb.web.dll).onStartup(AbstractDispatcherServletInitializer.java:71) по адресу org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:169) по адресу io.undertow.servlet.core.Dmpljj.servlet.core.DeploymentManagerImpl$1.call(DeploymentManagerImpl.java:171) в io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:42cloction.cole ContextClassLoaderSetupAction.java:43) в io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44) в io.undertow.servlet.api.L egacyThreadSetupActionWrapper $ 1.call (LegacyThreadSetupActionWrapper.java:44) в io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44) в дочернем узле) в io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44) в io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:234)

Основной момент ошибки: " Не удалось зарегистрировать сервлет с именем dispatcher". Проверьте, не существует ли другой сервлет, зарегистрированный под тем же именем. At org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:85)

Пожалуйста, помогите мне решить эту проблему. Я использовал WildFly-10 на затмении.

3 ответа

  1. используйте класс конфигурации следующим образом:

    @ComponentScan(basePackages={"spittr.controllers"})
    @Configuration
    @EnableWebMvc
    public class SpringContextConfig1 extends WebMvcConfigurerAdapter{
    
        @Override            
        public void configureViewResolvers(ViewResolverRegistry registry) {
            InternalResourceViewResolver ivr=new InternalResourceViewResolver();
            ivr.setPrefix("/WEB-INF/jsp/");
            ivr.setSuffix(".jsp");
            ivr.setExposeContextBeansAsAttributes(true);
            registry.viewResolver(ivr);
        }
    }
    

    В основном вы расширяете WebMvcConfigurerAdapter не наследуя ни один из его методов (в моей версии 4.3.3 Spring по крайней мере).

  2. так как у вас есть один DispatcherServlet здесь вы можете добавить SpringContextConfig1 класс в корневой контекст и оставить контекст сервлета пустым: переключить тело метода getServletConfigClasses() под getRootConfigClasses() и наоборот - см . немного на ApplicationContext Иерархии


Кроме того, DispatcherServlet картирование более вероятно / вместо /home:

protected String[] getServletMappings() {
    return new String[] {"/"};
}

Мой друг столкнулся с той же проблемой. Проблема заключалась в том, что для класса не было задано правильное имя пакета. AAA и очистить проект перед упаковкой!!!

Вот код на GitHub

вы можете сделать несколько вещей, чтобы решить эту проблему.

  1. удалите целевой каталог и повторно разверните веб-сервер. целевой каталог
  2. Если ваш проект является проектом maven, вы можете нажать «maven clean package» в файле pom.xml и повторно развернуть веб-сервер. чистый пакет mvn
Другие вопросы по тегам