在JBoss上使用Spring MVC Java Config时出现404错误?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (258)

我用Java Config编写了一个小的Spring MVC应用程序。它在Tomcat上工作得很好,但在JBoss EAP 6.2上却没有。它在JBoss上成功部署,但是当我请求Spring MVC定义的任何页面和浏览器中的404错误时,我收到此警告。

WARN [org.springframework.web.servlet.PageNotFound] (http-/127.0.0.1:8080-1) No mapping found for HTTP request with URI [/example-web/pages/login.jsp] in DispatcherServlet with name 'dispatcher'

在这里你可以看到我的代码:

public class WebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

@Override
protected Class<?>[] getRootConfigClasses() {
    return new Class[] { RootConfiguration.class};
}

@Override
protected Class<?>[] getServletConfigClasses() {
    return new Class[] { WebMvcConfig.class };
}

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

@Override
protected Filter[] getServletFilters() {
    return new Filter[] { new HiddenHttpMethodFilter() };
}
}

这是我的Spring MVC配置:

@EnableWebMvc
@ComponentScan("com.spring.example.w.controller")
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("login").setViewName("login");
        registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
    }

    @Bean
    public InternalResourceViewResolver getInternalResourceViewResolver(){
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/pages/");
        resolver.setSuffix(".jsp");
        return resolver;
    }
}

和RootConfig:

@Configuration
@ComponentScan
public class RootConfiguration {
}

在部署期间,我可以在日志中看到请求被映射:

INFO  [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] (ServerService Thread Pool -- 71) Mapped "{[/start],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.springframework.web.servlet.ModelAndView com.spring.example.w.controller.StartController.handleStart() throws javax.servlet.ServletException,java.io.IOException
INFO  [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping] (ServerService Thread Pool -- 71) Mapped URL path [/login] onto handler of type [class org.springframework.web.servlet.mvc.ParameterizableViewController]
INFO  [org.springframework.web.context.ContextLoader] (ServerService Thread Pool -- 71) Root WebApplicationContext: initialization completed in 2530 ms
INFO  [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/example-web]] (ServerService Thread Pool -- 71) Initializing Spring FrameworkServlet 'dispatcher'
INFO  [org.springframework.web.servlet.DispatcherServlet] (ServerService Thread Pool -- 71) FrameworkServlet 'dispatcher': initialization started

任何有关我为什么会收到404错误的帮助以及此警告都非常感谢。我应该再一次强调它正在使用Tomcat。提前致谢。

提问于
用户回答回答于

您可能遇到了Red Hat错误1094248,“如果没有web.xml,则无法覆盖默认servlet”。这个问题显然影响了EAP 6.2,6.3和6.4.0。从错误报告:

将Spring调度程序servlet映射到url模式“/”不能以编程方式工作。换句话说,使用Java代码无法覆盖默认servlet。 结果:许多用户将Spring的DispatcherServlet映射到'/',这在web.xml中完成后工作正常。但是,当以编程方式完成此配置时,默认servlet首先绑定到“/”。这可以防止稍后绑定DispatcherServlet。未映射Spring控制器并检索404。 解决方法(如果有):使用web.xml配置或map dispalycher servlet programmaticaly到某些特定的URL模式。例如“/ dispatcher / *”

对于EAP 6.4,这在版本6.4.1中已得到修复。我不知道早期版本的EAP。该错误已于2017年1月修复,因此您需要查找之后发布的补丁。

有权访问Red Hat解决方案知识库的人也可能希望查看解决方案1211203

用户回答回答于

正在阅读SivaLabs的教程,在JBoss上运行应用程序时出现这样的问题,可以正常使用tomcat。通过将DispatcherServlet映射更改为“/ app / *”来解决问题。您也可以尝试实现WebApplicationInitializer而不是使用抽象类。这是一个例子:

 @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        WebApplicationContext context = getContext();
        servletContext.addListener(new ContextLoaderListener(context));
        ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet", new DispatcherServlet(context));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/"); // i have a more or less big website, and can't see advantages by using "/*" mapping, this can be also a problem. 
    }

    private AnnotationConfigWebApplicationContext getContext() {
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.setConfigLocations("ua.company.config.WebConfig", "ua.company.config.PersistenceConfig", "ua.company.config.SecurityConfig");
        return context;
    }

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励