[英]java.lang.IllegalArgumentException: Failed to register servlet with name 'dispatcher'.Check if there is another servlet registered under the same name
我的初始化器类
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";
}
}
这是一个非常简单的程序,我编写了该程序来测试Spring MVC的JavaConfig。我完全按照《 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.undertow.deployment.default-server.default-host./spittr中的jboss.msc.service.StartException:java.lang.RuntimeException:java.lang.IllegalArgumentException:无法注册名称为'dispatcher'的servlet。还有另一个以相同名称注册的servlet。 在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.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)处运行(FutureTask.java:266) org.jboss.threads.JBossThread.run(JBossThread.java:320)的.run(Thread.java:745)原因:java.lang.RuntimeException:java.lang.IllegalArgumentException:无法注册名称为“ dispatcher”的servlet检查是否有另一个以相同名称注册的servlet。 在org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:100)在io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:236)在org.wildfly.extension.undertow.deployment .UndertowDeploymentService $ 1.run(UndertowDeploymentService.java:82)... 6个其他原因:java.lang.IllegalArgumentException:无法注册名称为'dispatcher'的Servlet。请检查是否有另一个Servlet以相同的名称注册。 在org.springframework.web.servlet.support.AbstractDispatcherServletInitializer.registerDispatcherServlet(AbstractDispatcherServletInitializer.java:98)在org.springframework.web.Servlet.support.AbstractDispatcherServletInitializer处org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:169)上的io.undertow.servlet.core.DeploymentManagerImpl $ 1.call(DeploymentManagerImpl.java:186)上的.onStartup(AbstractDispatcherServletInitializer.java:71) io.undertow.servlet.core.ServletRequestContextThreadSetupAction $ 1.call(ServletRequestContextThreadSetupAction.java:42)的io.undertow.servlet.core.DeploymentManagerImpl $ 1.call(DeploymentManagerImpl.java:171)在io.undertow.servlet.core.ContextClassLoaderSetupAction $ 1.call( io.undertow.servlet.api.LegacyThreadSetupActionWrapper $ 1.call(LegacyThreadSetupActionWrapper.java:44)上io.undertow.servlet.api.L的ContextClassLoaderSetupAction.java:43) io.undertow.servlet.api.LegacyThreadSetupActionWrapper $ 1.call(LegacyThreadSetupActionWrapper.java:44)上的io.undertow.servlet.api.LegacyThreadSetupActionWrapper $ 1上的egacyThreadSetupActionWrapper $ 1.call(LegacyThreadSetupActionWrapper.java:44) )在io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:234)在io.undertow.servlet.api.LegacyThreadSetupActionWrapper $ 1.call(LegacyThreadSetupActionWrapper.java:44)
该错误的亮点是 “ 无法注册名称为'dispatcher'的servlet。请检查是否存在另一个以相同名称注册的servlet。请访问org.wildfly.extension.undertow.deployment.UndertowDeploymentService $ 1.run(UndertowDeploymentService.java: 85)
请帮我解决这个问题。 我在日食上使用WildFly-10。
使用配置类,如下所示:
@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
类添加到根上下文,并将Servlet上下文保留为空:在getRootConfigClasses()
下切换方法getServletConfigClasses()
的主体, 反之亦然 -参见ApplicationContext
Hierarchies上的内容 。
而且, DispatcherServlet
映射更有可能/
而不是/home
:
protected String[] getServletMappings() {
return new String[] {"/"};
}
我的朋友遇到了同样的问题。 问题是没有为该类设置正确的程序包名称。 AAA并在包装前清洁项目!!!
这是GitHub上的代码
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.