title: org.springframework.web.SpringServletContainerInitializer cannot be cast to javax.servlet.ServletContainerInitializer -- Eclipse Spring Project
body: <p>please let me begin by telling you what I intend to do. I intend to follow through the tutorial on 'Building a RESTful Web Service' exactly as is mentioned in the Springframework's website 
  <a href="http://spring.io/guides/gs/rest-service/" rel="nofollow">http://spring.io/guides/gs/rest-service/</a> </p>
  
  <p>My problem is setting up the environment so I can launch a first prototype. I am reliant on the Eclipse IDE on a Windows 7 64-bit machine. The project is based on a 'gradle' build file. I get the error when I try to run the project using the build.gradle. Here is how I am trying to run the project.</p>
  
  <p>At the project explorer window, right-click on the project>Run As>Gradle build>tomcatrun</p>
  
  <p>The build.gradle file is as follows:</p>
  
  <pre><code>apply plugin: 'war'
  apply plugin: 'tomcat'
  apply plugin: 'java'
  apply plugin: 'propdeps'
  apply plugin: 'propdeps-maven'
  apply plugin: 'propdeps-idea'
  apply plugin: 'propdeps-eclipse'
  apply plugin: 'eclipse'
  apply plugin: 'idea'
  
  buildscript {
    repositories {
      mavenCentral()
      maven {
        url "http://download.java.net/maven/2"
      }
      maven { url 'http://repo.spring.io/plugins-release' }
    }
  
    dependencies {
      classpath 'org.gradle.api.plugins:gradle-tomcat-plugin:0.9.8'
      classpath 'org.springframework.build.gradle:propdeps-plugin:0.0.1'
    }
  }
  
  
  repositories {
      mavenCentral()
  }
  
  dependencies {
      def tomcatVersion = '7.0.12'
      tomcat "org.apache.tomcat.embed:tomcat-embed-core:${tomcatVersion}",
              "org.apache.tomcat.embed:tomcat-embed-logging-juli:${tomcatVersion}"
      tomcat("org.apache.tomcat.embed:tomcat-embed-jasper:${tomcatVersion}") {
        exclude group: 'org.eclipse.jdt.core.compiler', module: 'ecj'
      }
  
      compile 'org.springframework:spring-core:3.2.3.RELEASE'
      compile 'org.springframework:spring-webmvc:3.2.3.RELEASE'
      compile 'com.jayway.jsonpath:json-path:0.8.1'
  
      compile 'org.slf4j:slf4j-api:1.7.5'
      runtime 'org.slf4j:slf4j-jdk14:1.7.5'
      runtime 'com.fasterxml.jackson.core:jackson-core:2.2.2'
      runtime 'com.fasterxml.jackson.core:jackson-databind:2.2.2'
      runtime 'javax.xml.bind:jaxb-api:2.2.9'
  
      provided 'javax.servlet:javax.servlet-api:3.0.1' 
  
      testCompile 'com.jayway.jsonpath:json-path-assert:0.8.1'
      testCompile 'org.springframework:spring-test:3.2.3.RELEASE'
      testCompile 'junit:junit:4.+'
      testCompile "org.mockito:mockito-all:1.9.5"
  
  }
  
  task wrapper(type: Wrapper) {
      gradleVersion = '1.6'
  }
  
  tomcatRunWar.contextPath = ''
  </code></pre>
  
  <p>I think the problem is in correctly defining dependency with the package.
       'javax.servlet:javax.servlet-api:3.0.1'</p>
  
  <p>Some other references on the web mention supplying the 'provided' attribute in the build file. That keyword is indeed present in the file. I tried looking up how to do the same on some gradle documentation (in case something was missing) but I can't locate the problem. The tutorial assumes that you're running the build in a linux shell. I think there's some thing about using the eclipse IDE that triggers the error. Any help will be appreciated. Here is the WebApplicationInitializer file:</p>
  
  <pre><code>// {!begin top}
  package com.yummynoodlebar.config;
  
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  import org.springframework.web.WebApplicationInitializer;
  import org.springframework.web.context.ContextLoaderListener;
  import org.springframework.web.context.WebApplicationContext;
  import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
  import org.springframework.web.filter.DelegatingFilterProxy;
  import org.springframework.web.servlet.DispatcherServlet;
  
  import javax.servlet.FilterRegistration;
  import javax.servlet.ServletContext;
  import javax.servlet.ServletRegistration;
  import java.util.Set;
  
  public class WebAppInitializer implements WebApplicationInitializer {
  
    private static Logger LOG = LoggerFactory.getLogger(WebAppInitializer.class);
  // {!end top}
  
    // {!begin onStartup}
    @Override
    public void onStartup(ServletContext servletContext) {
      WebApplicationContext rootContext = createRootContext(servletContext);
  
      configureSpringMvc(servletContext, rootContext);
    }
    // {!end onStartup}
  
    // {!begin createRootContext}
    private WebApplicationContext createRootContext(ServletContext servletContext) {
      AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
      rootContext.register(CoreConfig.class);
      rootContext.refresh();
  
      servletContext.addListener(new ContextLoaderListener(rootContext));
      servletContext.setInitParameter("defaultHtmlEscape", "true");
  
      return rootContext;
    }
    // {!end createRootContext}
  
    // {!begin configureTop}
    private void configureSpringMvc(ServletContext servletContext, WebApplicationContext rootContext) {
      AnnotationConfigWebApplicationContext mvcContext = new AnnotationConfigWebApplicationContext();
      mvcContext.register(MVCConfig.class);
  
      mvcContext.setParent(rootContext);
  
      // {!end configureTop}
      // {!begin configureBottom}
      ServletRegistration.Dynamic appServlet = servletContext.addServlet(
          "webservice", new DispatcherServlet(mvcContext));
      appServlet.setLoadOnStartup(1);
      Set&lt;String&gt; mappingConflicts = appServlet.addMapping("/");
  
      if (!mappingConflicts.isEmpty()) {
        for (String s : mappingConflicts) {
          LOG.error("Mapping conflict: " + s);
        }
        throw new IllegalStateException(
            "'webservice' cannot be mapped to '/'");
      }
      // {!end configureBottom}
    }
  }
  </code></pre>
  
  <p>Thanks a lot!</p>