首页 文章

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

提问于
浏览
0

My initializer class

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"};
}

}

Configuration Class

@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

@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 ERROR [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'的servlet . 检查如果有另一个以相同名称注册的servlet . at org.wildfly.extension.undertow.deployment.UndertowDeploymentService $ 1.run(UndertowDeploymentService.java:85)at java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:511)at java.util.concurrent.FutureTask . java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)在java.lang.Thread的java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)上运行(FutureTask.java:266) .run(Thread.java:745)at org.jboss.threads.JBossThread.run(JBossThread.java:320)引起:java.lang.RuntimeException:java.lang.IllegalArgumentException:无法注册名为'dispatcher'的servlet . 检查是否有另一个以相同名称注册的servlet . 在org.wildfly.extension.undertow.deployment的org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:100)的io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:236)中.UndertowDeploymentService $ 1.run(UndertowDeploymentService.java:82)... 6更多引起:java.lang.IllegalArgumentException:无法注册名为'dispatcher'的servlet . 如果有另一个servlet注册在同一名称下,请检查 . org.springframework.util.Assert.notNull(Assert.java:115)org.springframework.web.servlet.support.AbstractDispatcherServletInitializer.registerDispatcherServlet(AbstractDispatcherServletInitializer.java:98)org.springframework.web.servlet.support.AbstractDispatcherServletInitializer位于io.undertow的io.undertow.servlet.core.DeploymentManagerImpl $ 1.call(DeploymentManagerImpl.java:186)org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:169)的.onStartup(AbstractDispatcherServletInitializer.java:71) .servlet.core.DeploymentManagerImpl $ 1.call(DeploymentManagerImpl.java:171)at io.undertow.servlet.core.ServletRequestContextThreadSetupAction $ 1.call(ServletRequestContextThreadSetupAction.java:42)at io.undertow.servlet.core.ContextClassLoaderSetupAction $ 1.call( ContextClassLoaderSetupAction.java:43)在io.undertow.servlet.api.L上的io.undertow.servlet.api.LegacyThreadSetupActionWrapper $ 1.call(LegacyThreadSetupActionWrapper.java:44) egoThreadSetupActionWrapper $ 1.call(LegacyThreadSetupActionWrapper.java:44)at io.undertow.servlet.api.LegacyThreadSetupActionWrapper $ 1.call(LegacyThreadSetupActionWrapper.java:44)at io.undertow.servlet.api.LegacyThreadSetupActionWrapper $ 1.call(LegacyThreadSetupActionWrapper.java:44 )at io.undertow.servlet.api.LegacyThreadSetupActionWrapper $ 1.call(LegacyThreadSetupActionWrapper.java:44)at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:234)

The hightlight of the error is that “无法注册名称为'dispatcher'的servlet . 检查是否有另一个以相同名称注册的servlet . 在org.wildfly.extension.undertow.deployment.UndertowDeploymentService $ 1.run(UndertowDeploymentService.java:85)”

请帮我解决这个问题 . 我在日食上使用WildFly-10 .

2 回答

  • 0
    • 使用配置类如下:
    @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() 的主体,反之亦然 - 参见A Bit on ApplicationContext Hierarchies .

    此外, DispatcherServlet 映射更可能是 / 而不是 /home

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

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

    这是GitHub上的代码

相关问题