使用带有静态HTML页面的Spring Boot + MVC玩耍,同时注意到这件事:
首先,我有:
索引控制器:
@Controller public class IndexController { @RequestMapping("/") public String index() { return "index.html"; } @RequestMapping("/{path:[^\\.]+}/**") public String forward() { return "forward:/"; } }
HTML文件是:...\src\main\resources\static\index.html
...\src\main\resources\static\index.html
因此,当我的主要应用程序类是:
@SpringBootApplication public class MyApplication extends WebMvcConfigurerAdapter { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }
一切正常,在默认路径下:localhost:8080\我得到index.html页面内容
localhost:8080\
index.html
但是如果我用 @EnableWebMvc
@EnableWebMvc
@SpringBootApplication @EnableWebMvc public class MyApplication extends WebMvcConfigurerAdapter { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }
我得到异常:javax.servlet.ServletException: Could not resolve view with name 'index.html' in servlet with name 'dispatcherServlet' 但是根据这个Spring文档,这是一个有效的配置。
javax.servlet.ServletException: Could not resolve view with name 'index.html' in servlet with name 'dispatcherServlet'
也许有人可以解释我为什么?我了解不对吗?
根据spring-boot的文档
自动配置在Spring的默认值之上添加了以下功能: 静态index.html支持。 … 如果您想保留Spring Boot MVC功能,并且只想添加其他MVC配置(拦截器,格式化程序,视图控制器等),则可以添加自己@Configuration的type类 WebMvcConfigurerAdapter,但 不添加 @EnableWebMvc。如果您希望提供的自定义实例RequestMappingHandlerMapping, RequestMappingHandlerAdapter或者ExceptionHandlerExceptionResolver可以声明一个WebMvcRegistrationsAdapter提供此类组件的实例。
自动配置在Spring的默认值之上添加了以下功能:
…
如果您想保留Spring Boot MVC功能,并且只想添加其他MVC配置(拦截器,格式化程序,视图控制器等),则可以添加自己@Configuration的type类 WebMvcConfigurerAdapter,但 不添加 @EnableWebMvc。如果您希望提供的自定义实例RequestMappingHandlerMapping, RequestMappingHandlerAdapter或者ExceptionHandlerExceptionResolver可以声明一个WebMvcRegistrationsAdapter提供此类组件的实例。
@Configuration
WebMvcConfigurerAdapter
RequestMappingHandlerMapping
RequestMappingHandlerAdapter
ExceptionHandlerExceptionResolver
WebMvcRegistrationsAdapter
因此,通过添加@EnableWebMvc您只需禁用对您的spring-boot自动配置。即静态index.html支持。