EnableWebMvc throws ServletException: Could not resolve view with name

Bublik picture Bublik · Jan 9, 2017 · Viewed 21.5k times · Source

Playing around with Spring Boot + MVC with static HTML pages, while noticed this thing:

Firstly, what I have:

Index controller:

@Controller
public class IndexController {

    @RequestMapping("/")
    public String index() {
        return "index.html";
    }

    @RequestMapping("/{path:[^\\.]+}/**")
    public String forward() {
        return "forward:/";
    }
}

The Html file is:...\src\main\resources\static\index.html

So when my main application class is:

@SpringBootApplication
public class MyApplication extends WebMvcConfigurerAdapter {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

Everything works well and in default path: localhost:8080\ I get index.html page content

But if I annotate Application class with @EnableWebMvc

@SpringBootApplication
@EnableWebMvc
public class MyApplication extends WebMvcConfigurerAdapter {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

I get exception: javax.servlet.ServletException: Could not resolve view with name 'index.html' in servlet with name 'dispatcherServlet' But according to this spring doc it is a valid configuration.

Maybe someone can explain me why? Do I understand something wrong?

Answer

Ruslan Stelmachenko picture Ruslan Stelmachenko · Jan 9, 2017

According to spring-boot's docs

The auto-configuration adds the following features on top of Spring’s defaults:

  • Static index.html support.

...

If you want to keep Spring Boot MVC features, and you just want to add additional MVC configuration (interceptors, formatters, view controllers etc.) you can add your own @Configuration class of type WebMvcConfigurerAdapter, but without @EnableWebMvc. If you wish to provide custom instances of RequestMappingHandlerMapping, RequestMappingHandlerAdapter or ExceptionHandlerExceptionResolver you can declare a WebMvcRegistrationsAdapter instance providing such components.

So by adding @EnableWebMvc you just disable what spring-boot autoconfiguring for you. Namely static index.html support.