天天看點

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

使用maven啟動tomcat插件時報錯,錯誤如下:但是在IDE上啟動時并沒有錯誤,明顯的是一個類型轉換異常

java.lang.ClassCastException: org.springframework.web.filter.CharacterEncodingFilter cannot be cast to javax.servlet.Filter

        at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275)

        at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:422)

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

        at org.apache.catalina.core.StandardContext.filterStart(StandardConteaxt.java:4001)

        at org.apache.catalina.core.StandardContext.start(StandardContext.java:4651)

        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)

        at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)

        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)

        at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)

        at org.apache.catalina.startup.Embedded.start(Embedded.java:825)

        at org.codehaus.mojo.tomcat.AbstractRunMojo.startContainer(AbstractRunMojo.java:558)

        at org.codehaus.mojo.tomcat.AbstractRunMojo.execute(AbstractRunMojo.java:255)

        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)

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

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

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

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

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

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

        at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)

        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)

        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)

        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)

        at org.apache.maven.cli.MavenCli.execute(MavenCli.java:862)

        at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:286)

        at org.apache.maven.cli.MavenCli.main(MavenCli.java:197)

        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

        at java.lang.reflect.Method.invoke(Method.java:606)

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

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

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

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

然而直接在IDE上部署到tomcat上運作并沒有錯誤,原理上來說CharacterEncodingFilter 也是個Filter

它們內建關系如下:

public class CharacterEncodingFilter extends OncePerRequestFilter {

}

public abstract class OncePerRequestFilter extends GenericFilterBean {

}

public abstract class GenericFilterBean implements

Filter, BeanNameAware, EnvironmentAware, ServletContextAware, InitializingBean, DisposableBean {

}

确實這樣子轉換是不應該有異常的,如果有,那個可能有多個Filter,那麼CharacterEncodingFilter不知道要轉換成哪個

在IDE中找到Filter,我們可以從下面看出Filter不隻是存在于Tomcat的lib下,同樣的存在于javaee-api-7.0.jar下

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

找到問題的所在,到pom.xml中删除掉了javaee-api-7.0.jar的依賴,儲存,mvn clean compile tomcat:run果然可以。

另一種較好的解決方法是把該依賴的作用于設定為<scope>provided</scope>運作時将不會一起打包過去。