找不到带URI的HTTP请求的映射(spring 4.1 annotation配置)
首先,请不要锁定这个post。 我已经阅读了所有问题,但仍然无法解决我的问题。
我正在研究如何在spring上使用注释而不配置xml文件。
我正在坚持这个错误:
在DispatcherServlet中找不到具有URI [/WEB-INF/index.jsp]的HTTP请求的映射,其名称为“dispatcherServlet”
这是项目结构
这是我的pom.xml
4.0.0 com.mycompany spring-sample 1.0 war spring-sample ${project.build.directory}/endorsed UTF-8 org.springframework.boot spring-boot-starter-parent 1.2.0.M2 javax javaee-web-api 7.0 provided org.springframework spring-context org.springframework.boot spring-boot-starter-web spring-milestones Spring Milestones http://repo.spring.io/milestone false spring-snapshots http://repo.spring.io/snapshot spring-milestones http://repo.spring.io/milestone org.apache.maven.plugins maven-compiler-plugin 3.1 1.7 1.7 ${endorsed.dir} org.apache.maven.plugins maven-war-plugin 2.3 false org.apache.maven.plugins maven-dependency-plugin 2.6 validate copy ${endorsed.dir} true javax javaee-endorsed-api 7.0 jar org.springframework.boot spring-boot-maven-plugin repackage
这是配置类:
@ComponentScan(basePackages = "com.sample.spring") @EnableAutoConfiguration @EnableWebMvc @org.springframework.context.annotation.Configuration public class MainApp extends WebMvcConfigurerAdapter implements WebApplicationInitializer { @Override public void onStartup(ServletContext sc) throws ServletException { // Create the 'root' Spring application context AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext(); rootContext.register(MainApp.class); // Manage the lifecycle of the root application context sc.addListener(new ContextLoaderListener(rootContext)); ServletRegistration.Dynamic registration = sc.addServlet("dispatcher", new DispatcherServlet()); registration.setLoadOnStartup(1); registration.addMapping("/"); } @Bean public ViewResolver configureViewResolver() { InternalResourceViewResolver viewResolve = new InternalResourceViewResolver(); viewResolve.setPrefix("/WEB-INF/"); viewResolve.setSuffix(".jsp"); return viewResolve; } @Bean public RequestMappingHandlerMapping requestMappingHandlerMapping() { return new RequestMappingHandlerMapping(); } @Bean public RequestMappingHandlerAdapter requestMappingHandlerAdapter() { return new RequestMappingHandlerAdapter(); } public static void main(String[] args) { SpringApplication.run(MainApp.class, args); } }
这是控制器:
@org.springframework.stereotype.Controller public class Controller { @RequestMapping(value="/", method = RequestMethod.GET) public String index(){ return "index"; } }
index.jsp在WEB-INF文件夹中,web.xml文件中没有任何内容。
我认为到目前为止配置是正确的,因为它可以重定向到/WEB-INF/index.jsp。 但是,我认为我缺少一些配置来使应用程序理解路径。 (/WEB-INF/index.jsp)
鉴于您使用的是Spring Boot,您的配置远比它需要的复杂得多。 Boot将自动为您配置DispatcherServlet
, ViewResolver
, RequestMappingHandlerMapping
和RequestMappingHandlerAdapter
。
查看Spring Boot的JSP示例 ,了解您需要的配置。
除了删除几乎所有的手动配置之外,一个关键的区别是你的主应用程序类应该扩展SpringBootServletInitializer
而不是直接实现Spring的WebApplicationInitializer
。 这是上述示例中的等价类:
package sample.jsp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.context.web.SpringBootServletInitializer; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @EnableAutoConfiguration @ComponentScan public class SampleWebJspApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(SampleWebJspApplication.class); } public static void main(String[] args) throws Exception { SpringApplication.run(SampleWebJspApplication.class, args); } }
使用java -jar
启动war文件时使用main
方法,并且在将war部署到单独的Servlet容器时使用configure
方法。
另请注意该示例使用application.properties来配置视图前缀和后缀。