Close

Spring MVC - Importing configurations with @EnableWebMvc

[Last Updated: Feb 25, 2026]

Adding this annotation to a @Configuration class imports the Spring MVC configuration from WebMvcConfigurationSupport which is the main class providing the configuration behind the MVC Java config.

@EnableWebMvc
@Configuration
public class MyWebConfig {
 .....
}

If you don't use this annotation (like this example) you might not initially notice any difference but things like content-type and accept header, generally content negotiation won't work.


When you don't use @EnableWebMvc, Spring falls back to its old, outdated system just to make sure really old apps (from 2007-2010) still work. But if you're building anything new, you should always use @EnableWebMvc to get all the modern features.


If you are using XML based configuration then use <mvc:annotation-driven/> as an alternative to @EnableWebMvc

@EnableWebMvc and <mvc:annotation-driven /> have the same purpose, mixing them doesn't work in some cases.

Definition of EnableWebMvc

Version: 7.0.5
 package org.springframework.web.servlet.config.annotation;
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.TYPE)
 @Documented
 @Import(DelegatingWebMvcConfiguration.class)
 public @interface EnableWebMvc {
 }

As seen above EnableWebMvc imports DelegatingWebMvcConfiguration which is a subclass of WebMvcConfigurationSupport. See the list of configuration performed by this support class here.

How to Customize Configurations?

To customize the configuration imported by @EnableWebMvc, we should extend the class WebMvcConfigurer and override the methods we want to do related customization with. Our WebMvcConfigurer methods are automatically called by Spring during the configuration stage

Note: In versions before Spring 5.0 (pre-2017), we had to extend the WebMvcConfigurerAdapter class instead of implementing WebMvcConfigurer directly. The adapter class is now deprecated because Java 8+ allows default methods in interfaces, making the adapter unnecessary.
WebMvcConfigurerAdapter was completely removed in Spring 6.

Definition of WebMvcConfigurer

Version: 7.0.5
 package org.springframework.web.servlet.config.annotation;
 public interface WebMvcConfigurer {
     default void configurePathMatch(PathMatchConfigurer configurer); 
     default void configureContentNegotiation(ContentNegotiationConfigurer
         configurer); 
     default void configureApiVersioning(ApiVersionConfigurer configurer);
         
     default void configureAsyncSupport(AsyncSupportConfigurer configurer);
         
     default void configureDefaultServletHandling(DefaultServletHandlerConfigurer
         configurer); 
     default void addFormatters(FormatterRegistry registry); 
     default void addInterceptors(InterceptorRegistry registry); 
     default void addResourceHandlers(ResourceHandlerRegistry registry); 
     default void addCorsMappings(CorsRegistry registry); 
     default void addViewControllers(ViewControllerRegistry registry); 
     default void configureViewResolvers(ViewResolverRegistry registry);
         
     default void addArgumentResolvers(List<HandlerMethodArgumentResolver>
         resolvers); 
     default void addReturnValueHandlers(List<HandlerMethodReturnValueHandler>
         handlers); 
     default void configureMessageConverters(HttpMessageConverters.ServerBuilder
         builder); 
     default void configureMessageConverters(List<HttpMessageConverter<?>>
         converters); 
     default void extendMessageConverters(List<HttpMessageConverter<?>>
         converters); 
     default void configureHandlerExceptionResolvers(List
         <HandlerExceptionResolver> resolvers); 
     default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver>
         resolvers); 
     default void addErrorResponseInterceptors(List<ErrorResponse.Interceptor>
         interceptors); 
     default Validator getValidator(); 
     default MessageCodesResolver getMessageCodesResolver(); 
 }

As seen above, the WebMvcConfigurer interface provides various customization points for Spring MVC, mostly to customize path matching, content negotiation, interceptors, CORS, view controllers, message converters, and exception handling to tailor Spring MVC exactly to your application's needs.

More advanced customization

If overriding WebMvcConfigurer does not work for us and we want to do some advance configuration then we should not use @EnableWebMvc annotation. In that case we should extend our @Configuration class directly from WebMvcConfigurationSupport or DelegatingWebMvcConfiguration and selectively override the methods including factory methods annotated with @Bean, remembering to add @Configuration to the subclass and @Bean to overridden @Bean methods. This approach gives you complete control to override core infrastructure beans (like RequestMappingHandlerMapping or RequestMappingHandlerAdapter) when you need to modify Spring MVC's internal behavior beyond what WebMvcConfigurer allows

Complete Example

This example show the basic use of @EnableWebMvc and WebMvcConfigurer.

The Controller

package com.logicbig.example;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class MyMvcController {

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String prepareView(Model model) {
        model.addAttribute("msg", "Hello from Spring");
        return "my-page";
    }
}

Configuration

package com.logicbig.example;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@EnableWebMvc
@Configuration
@ComponentScan
public class MyWebConfig implements WebMvcConfigurer {

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/WEB-INF/views/", ".jsp");
    }
}

Web Initializer

package com.logicbig.example;

import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRegistration;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

public class MyWebInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) {
        AnnotationConfigWebApplicationContext ctx =
                new AnnotationConfigWebApplicationContext();
        //register our config class
        ctx.register(MyWebConfig.class);

        ctx.setServletContext(servletContext);

        //using servlet 3 api to dynamically create
        //spring dispatcher servlet
        ServletRegistration.Dynamic servlet =
                servletContext.addServlet("springDispatcherServlet",
                                          new DispatcherServlet(ctx));

        servlet.setLoadOnStartup(1);
        servlet.addMapping("/");
    }
}

The View

src/main/webapp/WEB-INF/views/my-page.jsp

<%@ page language="java"
    contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<html>
<body>
    Message : ${msg}
</body>
</html>

Running the app

$ mvn clean jetty:run

$ curl  http://localhost:8080/spring-enable-web-mvc

<html>
<body>
Message : Hello from Spring
</body>
</html>

From Browser

Example Project

Dependencies and Technologies Used:

  • spring-webmvc 7.0.5 (Spring Web MVC)
     Version Compatibility: 3.2.9.RELEASE - 7.0.5Version List
    ×

    Version compatibilities of spring-webmvc with this example:

      javax.servlet-api:3.x
    • 3.2.9.RELEASE
    • 3.2.10.RELEASE
    • 3.2.11.RELEASE
    • 3.2.12.RELEASE
    • 3.2.13.RELEASE
    • 3.2.14.RELEASE
    • 3.2.15.RELEASE
    • 3.2.16.RELEASE
    • 3.2.17.RELEASE
    • 3.2.18.RELEASE
    • 4.0.0.RELEASE
    • 4.0.1.RELEASE
    • 4.0.2.RELEASE
    • 4.0.3.RELEASE
    • 4.0.4.RELEASE
    • 4.0.5.RELEASE
    • 4.0.6.RELEASE
    • 4.0.7.RELEASE
    • 4.0.8.RELEASE
    • 4.0.9.RELEASE
    • 4.1.0.RELEASE
    • 4.1.1.RELEASE
    • 4.1.2.RELEASE
    • 4.1.3.RELEASE
    • 4.1.4.RELEASE
    • 4.1.5.RELEASE
    • 4.1.6.RELEASE
    • 4.1.7.RELEASE
    • 4.1.8.RELEASE
    • 4.1.9.RELEASE
    • 4.2.0.RELEASE
    • 4.2.1.RELEASE
    • 4.2.2.RELEASE
    • 4.2.3.RELEASE
    • 4.2.4.RELEASE
    • 4.2.5.RELEASE
    • 4.2.6.RELEASE
    • 4.2.7.RELEASE
    • 4.2.8.RELEASE
    • 4.2.9.RELEASE
    • 4.3.0.RELEASE
    • 4.3.1.RELEASE
    • 4.3.2.RELEASE
    • 4.3.3.RELEASE
    • 4.3.4.RELEASE
    • 4.3.5.RELEASE
    • 4.3.6.RELEASE
    • 4.3.7.RELEASE
    • 4.3.8.RELEASE
    • 4.3.9.RELEASE
    • 4.3.10.RELEASE
    • 4.3.11.RELEASE
    • 4.3.12.RELEASE
    • 4.3.13.RELEASE
    • 4.3.14.RELEASE
    • 4.3.15.RELEASE
    • 4.3.16.RELEASE
    • 4.3.17.RELEASE
    • 4.3.18.RELEASE
    • 4.3.19.RELEASE
    • 4.3.20.RELEASE
    • 4.3.21.RELEASE
    • 4.3.22.RELEASE
    • 4.3.23.RELEASE
    • 4.3.24.RELEASE
    • 4.3.25.RELEASE
    • 4.3.26.RELEASE
    • 4.3.27.RELEASE
    • 4.3.28.RELEASE
    • 4.3.29.RELEASE
    • 4.3.30.RELEASE
    • 5.0.0.RELEASE
    • 5.0.1.RELEASE
    • 5.0.2.RELEASE
    • 5.0.3.RELEASE
    • 5.0.4.RELEASE
    • 5.0.5.RELEASE
    • 5.0.6.RELEASE
    • 5.0.7.RELEASE
    • 5.0.8.RELEASE
    • 5.0.9.RELEASE
    • 5.0.10.RELEASE
    • 5.0.11.RELEASE
    • 5.0.12.RELEASE
    • 5.0.13.RELEASE
    • 5.0.14.RELEASE
    • 5.0.15.RELEASE
    • 5.0.16.RELEASE
    • 5.0.17.RELEASE
    • 5.0.18.RELEASE
    • 5.0.19.RELEASE
    • 5.0.20.RELEASE
    • 5.1.0.RELEASE
    • 5.1.1.RELEASE
    • 5.1.2.RELEASE
    • 5.1.3.RELEASE
    • 5.1.4.RELEASE
    • 5.1.5.RELEASE
    • 5.1.6.RELEASE
    • 5.1.7.RELEASE
    • 5.1.8.RELEASE
    • 5.1.9.RELEASE
    • 5.1.10.RELEASE
    • 5.1.11.RELEASE
    • 5.1.12.RELEASE
    • 5.1.13.RELEASE
    • 5.1.14.RELEASE
    • 5.1.15.RELEASE
    • 5.1.16.RELEASE
    • 5.1.17.RELEASE
    • 5.1.18.RELEASE
    • 5.1.19.RELEASE
    • 5.1.20.RELEASE
    • 5.2.0.RELEASE
    • 5.2.1.RELEASE
    • 5.2.2.RELEASE
    • 5.2.3.RELEASE
    • 5.2.4.RELEASE
    • 5.2.5.RELEASE
    • 5.2.6.RELEASE
    • 5.2.7.RELEASE
    • 5.2.8.RELEASE
    • 5.2.9.RELEASE
    • 5.2.10.RELEASE
    • 5.2.11.RELEASE
    • 5.2.12.RELEASE
    • 5.2.13.RELEASE
    • 5.2.14.RELEASE
    • 5.2.15.RELEASE
    • 5.2.16.RELEASE
    • 5.2.17.RELEASE
    • 5.2.18.RELEASE
    • 5.2.19.RELEASE
    • 5.2.20.RELEASE
    • 5.2.21.RELEASE
    • 5.2.22.RELEASE
    • 5.2.23.RELEASE
    • 5.2.24.RELEASE
    • 5.2.25.RELEASE
    • 5.3.0
    • 5.3.1
    • 5.3.2
    • 5.3.3
    • 5.3.4
    • javax.servlet-api:4.x
    • 5.3.5
    • 5.3.6
    • 5.3.7
    • 5.3.8
    • 5.3.9
    • 5.3.10
    • 5.3.11
    • 5.3.12
    • 5.3.13
    • 5.3.14
    • 5.3.15
    • 5.3.16
    • 5.3.17
    • 5.3.18
    • 5.3.19
    • 5.3.20
    • 5.3.21
    • 5.3.22
    • 5.3.23
    • 5.3.24
    • 5.3.25
    • 5.3.26
    • 5.3.27
    • 5.3.28
    • 5.3.29
    • 5.3.30
    • 5.3.31
    • 5.3.32
    • 5.3.33
    • 5.3.34
    • 5.3.35
    • 5.3.36
    • 5.3.37
    • 5.3.38
    • 5.3.39
    • javax.* -> jakarta.*
      jakarta.servlet-api:6.x
      Java 17 min
    • 6.0.0
    • 6.0.1
    • 6.0.2
    • 6.0.3
    • 6.0.4
    • 6.0.5
    • 6.0.6
    • 6.0.7
    • 6.0.8
    • 6.0.9
    • 6.0.10
    • 6.0.11
    • 6.0.12
    • 6.0.13
    • 6.0.14
    • 6.0.15
    • 6.0.16
    • 6.0.17
    • 6.0.18
    • 6.0.19
    • 6.0.20
    • 6.0.21
    • 6.0.22
    • 6.0.23
    • 6.1.0
    • 6.1.1
    • 6.1.2
    • 6.1.3
    • 6.1.4
    • 6.1.5
    • 6.1.6
    • 6.1.7
    • 6.1.8
    • 6.1.9
    • 6.1.10
    • 6.1.11
    • 6.1.12
    • 6.1.13
    • 6.1.14
    • 6.1.15
    • 6.1.16
    • 6.1.17
    • 6.1.18
    • 6.1.19
    • 6.1.20
    • 6.1.21
    • 6.2.0
    • 6.2.1
    • 6.2.2
    • 6.2.3
    • 6.2.4
    • 6.2.5
    • 6.2.6
    • 6.2.7
    • 6.2.8
    • 6.2.9
    • 6.2.10
    • 6.2.11
    • 6.2.12
    • 6.2.13
    • 6.2.14
    • 6.2.15
    • 6.2.16
    • 7.0.0
    • 7.0.1
    • 7.0.2
    • 7.0.3
    • 7.0.4
    • 7.0.5

    Versions in green have been tested.

  • jakarta.servlet-api 6.1.0 (Jakarta Servlet API documentation)
  • jakarta.servlet.jsp.jstl 3.0.1 (Jakarta Standard Tag Library Implementation)
  • JDK 25
  • Maven 3.9.11

Spring MVC Select All Download
  • spring-enable-web-mvc
    • src
      • main
        • java
          • com
            • logicbig
              • example
                • MyWebConfig.java
          • webapp
            • WEB-INF
              • views

    See Also

    Join