eclipse - org.springframework.web.SpringServletContainerInitializer 无法转换为 javax.servlet.ServletContainerInitializer -- Eclipse Spring 项目

标签 eclipse spring tomcat spring-mvc servlet-3.0

请让我先告诉你我打算做什么。我打算完全按照 Springframework 网站中提到的“构建 RESTful Web 服务”教程进行操作 http://spring.io/guides/gs/rest-service/

我的问题是设置环境,以便我可以启动第一个原型(prototype)。我依赖于 Windows 7 64 位机器上的 Eclipse IDE。该项目基于“gradle”构建文件。当我尝试使用 build.gradle 运行项目时出现错误。以下是我尝试运行该项目的方式。

在项目资源管理器窗口中,右键单击项目>Run As>Gradle build>tomcatrun

build.gradle文件如下:

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 = ''

我认为问题在于正确定义包的依赖关系。 'javax.servlet:javax.servlet-api:3.0.1'

网络上的其他一些引用资料提到在构建文件中提供“provided”属性。该关键字确实存在于文件中。我尝试在一些 gradle 文档中查找如何执行相同的操作(以防丢失某些内容),但我找不到问题所在。本教程假定您在 linux shell 中运行构建。我认为使用 eclipse IDE 会触发错误。任何帮助将不胜感激。这是 WebApplicationInitializer 文件:

// {!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<String> 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}
  }
}

非常感谢!

最佳答案

我在 Tomcat 7(使用 Maven)中配置基于 Spring 的 Web 应用程序时遇到此错误。在我的 pom.xml 中存在以下依赖项:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
</dependency>

因此 javax.servlet jar 被包含在部署工件中。 在为上述依赖项提供“提供”的范围后,我能够解决这个问题。希望这会有所帮助....

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>

关于eclipse - org.springframework.web.SpringServletContainerInitializer 无法转换为 javax.servlet.ServletContainerInitializer -- Eclipse Spring 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21708828/

相关文章:

java - 使用 Maven 时如何在 Tomcat 7.0 中将上下文路径设置为根 ("/")

python - 如何将 Python.h 库添加到 Eclipse 以在 C++ 程序中使用?

java - 无法捕获 IOException

java - 在 Eclipse 中导入项目

spring - 在 Spring 中生成多个 SOAP Web 服务

spring - 未找到 REST CXF 和 Spring cxf-extension-jaxrs-binding 文件异常?

java - Spring 4 + Cassandra 3.4 + 不工作

java - Tomcat 6 下的 JSF 2.0 应用程序 : "No Factories configured."

Tomcat 7 覆盖上下文路径

java - 菜单栏在 Ubuntu 16.10 上的 eclipse neon.3 中一团糟