【问题标题】:Using Spring Mvc WebApplicationInitializer, But No mapping found for HTTP request使用 Spring Mvc WebApplicationInitializer,但未找到 HTTP 请求的映射
【发布时间】:2015-10-19 21:18:17
【问题描述】:

我在 Eclipse 和 JBoss 6.2 中使用 Spring MVC 设置示例代码库。

但我通过http://localhost:8080/rest/simple/main 得到“404”

Jboss日志如下:

2015-07-29 11:51:27,356 错误 [controller.simpleController] (http-/0.0.0.0:8080-1) 获取请求

2015-07-29 11:51:27,391 WARN [org.springframework.web.servlet.PageNotFound] (http-/0.0.0.0:8080-1) 找不到带有 URI [/rest/WEB 的 HTTP 请求的映射-INF/views/main.jsp] 在 DispatcherServlet 中,名称为 'dispatcher'

目录:

>rest-server-simple
 > -src
  > -main
     -java
      -config
         -InitConfig.java
         -ServletConfig.java
      -controller
         -simpleController.java
  > -webapp
   > -WEB-INF
       -jboss-web.xml
       >views
        -main.jsp

初始化配置:

public class InitConfig implements WebApplicationInitializer {
  @Override
  public void onStartup(ServletContext servletContext) throws ServletException {
  AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
  ctx.register(ServletConfig.class); 
  ServletRegistration.Dynamic registration = servletContext.addServlet("dispatcher",new DispatcherServlet(ctx));
  registration.setLoadOnStartup(1);
  registration.addMapping("/*");  }}

Servlet 配置:

@Configuration
@EnableWebMvc  
@ComponentScan(basePackages ="controller")
public class ServletConfig {
  @Bean
  public InternalResourceViewResolver internalResourceViewResolver() {  
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();  
    viewResolver.setPrefix("/WEB-INF/views/");  
    viewResolver.setSuffix(".jsp"); 
    return viewResolver;  
  }
}

jboss-web.xml:

<?xml version="1.0" encoding="UTF-8"?>  
<jboss-web>  
    <context-root>/rest</context-root>  
</jboss-web>

简单控制器:

@Controller
@RequestMapping(value = "/simple")
public class simpleController {

  private static final Logger logger = LoggerFactory.getLogger(simpleController.class);
  @RequestMapping(value = "/main", method = RequestMethod.GET)
  public String hello(){
    logger.error("get request");
    return "main";
  }
}

【问题讨论】:

标签: java spring spring-mvc spring-java-config request-mapping


【解决方案1】:
registration.addMapping("/*");

改成

registration.addMapping("/");

/*/ 之间存在差异。
/* 表示每个请求都将由DispatcherServlet 处理,在这种情况下检索jsp 或类似.../abc.xyz 等也会被转发到Dispatcher,因此当控制器请求view 时,它实际上会查找映射为/WEB-INF/views/main.jspRequestMapping,但是

/ 告诉容器只有那些没有pathinfo i.e /rest/simple/main 的请求才会被DispatcherServlet 处理。

更新#1

嗯.. 我发现jboss AS 7 不喜欢在没有web.xml 的情况下覆盖default servlet/,因此你仍然得到404,甚至没有在记录器上得到任何东西,原因是很简单,Dispatcher 永远不会映射到任何url。如果您想检查,只需在 addMapping("/*"); 之后添加以下内容@

 System.out.println("registration.getMappings() = " + registration.getMappings());

Tomcat &gt;= 7.0.15WildFly 都检查过。

要使其在JBoss7 上工作,有几个选项:
1. 将DispatcherServlet 映射从/ 更改为*.htm 或除DefaultServlet Mapping 之外的其他内容。
2. 将您的配置切换到web.xml。您必须在那里初始化 DispatcherServlet 并将带注释的类传递为`contextConfigLocation。 Check here for REF

【讨论】:

  • 当我使用 Tomcat 更改 Web 服务器时它工作正常。所以... Jboss 是问题的主要原因。
猜你喜欢
  • 2019-03-25
  • 2013-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多