您的位置:首页 > 编程语言 > Java开发

maven org.springframework.web.filter.CharacterEncodingFilter cannot be cast to javax.servlet.Filter

2017-04-25 00:00 691 查看
使用maven将项目部署到tomcat容器,启动的时候报如下错误:

解决Settingproperty'source'to'org.eclipse.jst.jee.server的问题

http://blog.csdn.net/z69183787/article/details/19911935

[java]viewplaincopy

严重:ExceptionstartingfiltercharsetFilter

java.lang.ClassCastException:org.springframework.web.filter.CharacterEncodingFiltercannotbecasttojavax.servlet.Filter

atorg.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275)

atorg.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:422)

atorg.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:115)

atorg.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4001)

atorg.apache.catalina.core.StandardContext.start(StandardContext.java:4651)

atorg.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)

atorg.apache.catalina.core.StandardHost.start(StandardHost.java:785)

atorg.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)

atorg.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)

atorg.apache.catalina.startup.Embedded.start(Embedded.java:825)

atorg.codehaus.mojo.tomcat.AbstractRunMojo.startContainer(AbstractRunMojo.java:558)

atorg.codehaus.mojo.tomcat.AbstractRunMojo.execute(AbstractRunMojo.java:255)

atorg.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:132)

atorg.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)

atorg.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)

atorg.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)

atorg.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)

atorg.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)

atorg.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)

atorg.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:120)

atorg.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:355)

atorg.apache.maven.DefaultMaven.execute(DefaultMaven.java:155)

atorg.apache.maven.cli.MavenCli.execute(MavenCli.java:584)

atorg.apache.maven.cli.MavenCli.doMain(MavenCli.java:216)

atorg.apache.maven.cli.MavenCli.main(MavenCli.java:160)

atsun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod)

atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

atjava.lang.reflect.Method.invoke(Method.java:483)

atorg.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)

atorg.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)

atorg.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)

atorg.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)

五月29,201511:01:46上午org.apache.catalina.core.StandardContextfilterStart

严重:ExceptionstartingfilterspringSecurityFilterChain

java.lang.ClassCastException:org.springframework.web.filter.DelegatingFilterProxycannotbecasttojavax.servlet.Filter

atorg.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275)

atorg.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:422)

atorg.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:115)

atorg.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4001)

atorg.apache.catalina.core.StandardContext.start(StandardContext.java:4651)

atorg.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)

atorg.apache.catalina.core.StandardHost.start(StandardHost.java:785)

atorg.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)

atorg.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)

atorg.apache.catalina.startup.Embedded.start(Embedded.java:825)

atorg.codehaus.mojo.tomcat.AbstractRunMojo.startContainer(AbstractRunMojo.java:558)

atorg.codehaus.mojo.tomcat.AbstractRunMojo.execute(AbstractRunMojo.java:255)

atorg.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:132)

atorg.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)

atorg.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)

atorg.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)

atorg.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)

atorg.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)

atorg.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)

atorg.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:120)

atorg.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:355)

atorg.apache.maven.DefaultMaven.execute(DefaultMaven.java:155)

atorg.apache.maven.cli.MavenCli.execute(MavenCli.java:584)

atorg.apache.maven.cli.MavenCli.doMain(MavenCli.java:216)

atorg.apache.maven.cli.MavenCli.main(MavenCli.java:160)

atsun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod)

atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

atjava.lang.reflect.Method.invoke(Method.java:483)

atorg.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)

atorg.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)

atorg.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)

atorg.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)

pom.xml文件部分配置如下:

[java]viewplaincopy

<preclass="java"name="code"><dependencies>

<dependency>

<groupId>jstl</groupId>

<artifactId>jstl</artifactId>

<version>1.2</version>

</dependency>

<dependency>

<groupId>javax.servlet</groupId>

<artifactId>servlet-api</artifactId>

<version>2.5</version>

<strong><scope>provided</scope><!--此处已经改过,试过还是不行--></strong>

</dependency>

<!--aspectjdependency-->

<dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjrt</artifactId>

<version>1.6.11</version>

</dependency>

<dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjweaver</artifactId>

<version>1.6.11</version>

</dependency>

<!--DataSource-->

<dependency>

<groupId>org.apache.commons</groupId>

<artifactId>commons-dbcp2</artifactId>

<version>2.0</version>

</dependency>

<dependency>

<groupId>commons-pool</groupId>

<artifactId>commons-pool</artifactId>

<version>1.5.7</version>

<scope>runtime</scope>

</dependency>

<!--javax-->

<dependency>

<groupId>javax</groupId>

<artifactId>javaee-api</artifactId>

<version>7.0</version>

<scope>provided</scope><!--问题出在这里-->

</dependency>

</dependencies>



web.xml文件部分配置如下:

[html]viewplaincopy

<servlet>

<servlet-name>springMVC</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<load-on-startup>2</load-on-startup>

</servlet>

[html]viewplaincopy

<!--ConfigureCharset-->

<filter>

<filter-name>charsetFilter</filter-name>

<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

<init-param>

<param-name>forceEncoding</param-name>

<param-value>true</param-value>

</init-param>

</filter>

纠结了一天,网上说是jar包冲突:

“tomcat启动后先将tomcat/lib目录下的jar包全部读入内存,如果webapps目录里的应用程序中WEB-INF/lib目录下有相同的包,将无法加载,

不同版本的包之间也会造成类似问题。

解决这个问题的方法就是对于servlet-ap.jar使用<scope>标签,编译的时候用到servlet-api和jsp-api,但在打包的时候不用这两个依赖

如下”

[html]viewplaincopy

<dependency>

<groupId>javax.servlet</groupId>

<artifactId>servlet-api</artifactId>

<version>2.4</version>

<scope>provided</scope>

</dependency>

后来在网上看到一篇文章(http://stackoverflow.com/questions/15715864/opensessioninviewfilter-cannot-be-cast-to-javax-servlet-filter),终于找到问题。

如下测试代码,能告诉你class文件是从哪个jar包中加载的

[java]viewplaincopy

@Test

publicvoidget(){

URLurl=Filter.class.getProtectionDomain().getCodeSource().getLocation();

System.out.println("path:"+url.getPath()+"name:"+url.getFile());

importjava.net.URL;

importjavax.servlet.Filter;

importorg.junit.Test;

publicclassd{
@Test
publicvoidtestget(){
URLurl=Filter.class.getProtectionDomain().getCodeSource().getLocation();
System.out.println("path:"+url.getPath()+"name:"+url.getFile());
}


}

//输出结果:path:/C:/Users/User/.m2/repository/javax/javaee-api/7.0/javaee-api-7.0.jarname:/C:/Users/User/.m2/repository/javax/javaee-api/7.0/javaee-api-7.0.jar

我们实际项目中用到了javaee的api,javaee-api-7.0.jar文件中也有Filter,所以在引用javaee-api依赖的时候,pom.xml文件中对应的加上“<scope>provided</scope>”就可以了

(说明:

测试的时候,需要将pom.xml文件中

[html]viewplaincopy

<!--

[html]viewplaincopy

<dependency>

<groupId>javax.servlet</groupId>

<artifactId>servlet-api</artifactId>

<version>2.5</version>

<scope>provided</scope>

</dependency>

[html]viewplaincopy

-->
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Filter
相关文章推荐