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 ответа
используйте класс конфигурации следующим образом:
@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 по крайней мере).так как у вас есть один
DispatcherServlet
здесь вы можете добавитьSpringContextConfig1
класс в корневой контекст и оставить контекст сервлета пустым: переключить тело методаgetServletConfigClasses()
подgetRootConfigClasses()
и наоборот - см . немного наApplicationContext
Иерархии
Кроме того, DispatcherServlet
картирование более вероятно /
вместо /home
:
protected String[] getServletMappings() {
return new String[] {"/"};
}
Мой друг столкнулся с той же проблемой. Проблема заключалась в том, что для класса не было задано правильное имя пакета. AAA и очистить проект перед упаковкой!!!
Вот код на GitHub
вы можете сделать несколько вещей, чтобы решить эту проблему.
- удалите целевой каталог и повторно разверните веб-сервер. целевой каталог
- Если ваш проект является проектом maven, вы можете нажать «maven clean package» в файле pom.xml и повторно развернуть веб-сервер. чистый пакет mvn