org.springframework.web.SpringServletContainerInitializer 无法转换为 javax.servlet.ServletContainerInitializer -- Eclipse Spring Proj
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/21708828/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
org.springframework.web.SpringServletContainerInitializer cannot be cast to javax.servlet.ServletContainerInitializer -- Eclipse Spring Project
提问by apil.tamang
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 http://spring.io/guides/gs/rest-service/
请让我先告诉你我打算做什么。我打算完全按照 Springframework 网站http://spring.io/guides/gs/rest-service/ 中提到的“构建 RESTful Web 服务”教程进行操作
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.
我的问题是设置环境以便我可以启动第一个原型。我依赖于 Windows 7 64 位机器上的 Eclipse IDE。该项目基于“gradle”构建文件。当我尝试使用 build.gradle 运行项目时出现错误。这是我尝试运行该项目的方式。
At the project explorer window, right-click on the project>Run As>Gradle build>tomcatrun
在项目资源管理器窗口,右键单击项目>Run As>Gradle build>tomcatrun
The build.gradle file is as follows:
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.Hymanson.core:Hymanson-core:2.2.2'
runtime 'com.fasterxml.Hymanson.core:Hymanson-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 = ''
I think the problem is in correctly defining dependency with the package. 'javax.servlet:javax.servlet-api:3.0.1'
我认为问题在于正确定义包的依赖关系。'javax.servlet:javax.servlet-api:3.0.1'
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:
网络上的其他一些参考资料提到在构建文件中提供“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}
}
}
Thanks a lot!
非常感谢!
回答by Subhankar
I got this error, while configuring my Spring Based Web Application in Tomcat 7(using Maven).In my pom.xml the following dependency was there:
在 Tomcat 7(使用 Maven)中配置基于 Spring 的 Web 应用程序时,出现此错误。在我的 pom.xml 中,存在以下依赖项:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
Due to which the javax.servlet jar is getting included in the deployment artifact. Upon providing the scope "provided" to the above mentioned dependency I was able to fix the issue. Hope this helps....
因此,javax.servlet jar 被包含在部署工件中。在为上述依赖项提供“提供”的范围后,我能够解决这个问题。希望这可以帮助....
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>