繁体   English   中英

java.lang.IllegalArgumentException:无法注册名称为'dispatcher'的servlet。检查是否有另一个以相同名称注册的servlet。

[英]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。

  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类添加到根上下文,并将Servlet上下文保留为空:在getRootConfigClasses()下切换方法getServletConfigClasses()的主体, 反之亦然 -参见ApplicationContext Hierarchies上的内容


而且, DispatcherServlet映射更有可能/而不是/home

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

我的朋友遇到了同样的问题。 问题是没有为该类设置正确的程序包名称。 AAA并在包装前清洁项目!!!

这是GitHub上的代码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM